Как решить усеченные изображения, созданные сценарием php?

У меня есть изображение, которое разорвано PHP-скриптом. Я называю это так.

 <img src="/index.php/image-name.jpg">

Если возраст изображения превышает 5 минут, мой сценарий извлечет новую копию изображения из поставщика данных, а затем отобразит новое изображение.

Когда веб-сайт, который предоставляет изображения, загружен, и этот скрипт запускает выборку новой копии, он часто отображает только верхнюю часть изображения. Firebug скажет мне, что изображение повреждено или усечено. Если я открою изображение в новой вкладке, у моего сервера будет полная копия. Если я запускаю скрипт второй раз в течение 5 минут, он работает отлично.

Выглядит так, будто для получения изображения, на которое он выходит из строя, уходит больше определенного времени, и отображается только верхняя часть. Любые мысли о том, как заставить его ждать дольше, прежде чем сдаться? Или, может быть, я нахожусь на неправильном пути с тем, что идет не так.

<?php
  // get the image name from the uri
  $path= $_SERVER['REQUEST_URI'];
  $image = explode("/", $path);
  $image=$image[3];//Get the file name
  $image=str_replace('%20',' ', $image); //make it all spaces

  $localimage='./road_images/'.$image; //where to find the image on the sever
  // check if the image exists, this prevents some kinds of attacks
  if (is_file($localimage)) {
    $age = filemtime($localimage);     // get the file age
    if ($age < time() - (60*5)) { // 5 mins old
        $simage='http://www.someplace/cams/'.$image;
        $simage=str_replace(' ', '%20', $simage);//need to remove the spaces for URLs
        copy($simage, $localimage);
    }
    // serve the image to the user.
    $fp = fopen($localimage, 'r');
    // send the right headers
    header("Content-Type: image/jpg");
    header("Content-Length: " . filesize($localimage));
    // dump the picture and stop the script
    fpassthru($fp);
    exit();
  }
  else
  {
        echo("Error, no such file: '$image'");
  }
?>

РЕДАКТИРОВАТЬ: обнаружили это, отредактировав

        header("Content-Length: " . filesize($localimage));

Работает как положено. Все еще пытаюсь понять, почему.

1 ответ

Это было больно. Я передал неправильное значение заголовка Content-Length. Редактирование длины контента решило проблему так, чтобы она работала просто отлично. Учитывая, что это статический контент, я не знаю, почему то, что у меня есть выше, не работает.

С большим количеством исследований выяснили, как это работает.

я кладу ob_start() близко к началу Новый заголовок Content-Length header('Content-Length: ' . ob_get_length());идет внизу, непосредственно перед выходом скрипта.

Сделано таким образом, это работает каждый раз и приятно для браузера.

Другие вопросы по тегам