2015-12-04 6 views
0

У меня есть изображение, которое разорвано скриптом 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'"); 
    } 
?> 

EDIT: обнаружили, что при редактировании из

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

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

+0

Я зеркалирую другой сайт, который не позволит мне hotlink. Изображение обновляется каждые 5 минут. Если моя копия изображения больше 5 минут, я получаю новую копию и показываю ее. Если ему меньше 5 минут, то я использую копию, которую у меня уже есть. – Brandan

+0

ohh .. знаете ли вы размеры файлов? Может быть, файл слишком большой для вашего веб-сервера. (игнорировать мой последний комментарий) – tanjir

+0

Изображения довольно маленькие. Большой будет 328 × 314 пикселей и 30 КБ. Ночью большинство изображений черное или близко к нему и ближе к 10 КБ. – Brandan

ответ

0

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

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

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

Выполнено таким образом, что он работает каждый раз и хорош для браузера.

 Смежные вопросы

  • Нет связанных вопросов^_^