2012-09-18 4 views
1

У меня есть приложение, работающее под Drupal в среде LAMP. Он выводит изображения из базы данных. На моей персональной машине (OS X Lion) она работает правильно. На сервере dev (Amazon EC2) тот же самый код не работает. Оба сервера работают с PHP 5.3. Я подтвердил, что данные повреждаются между echo $fileData и получают его браузер. Кроме того, я подтвердил, что данные НЕ повреждены, если они закодированы в base64 (я использовал скрипт для запроса данных, декодирования и сохранения его в файл).Данные изображения повреждены на пути к браузеру

На стороне Drupal код находится в модуле, который создает обратный вызов меню; функция обратного вызова echos данные файла напрямую, чтобы избежать хранения всего изображения в памяти (я использовал PDO :: FETCH_BOUND с PDO :: PARAM_LOB для создания потока, но теперь он идет в строку, пока я пытаюсь найти проблему , это не так). Элемент меню имеет настраиваемый обратный вызов доставки, который практически ничего не делает. Я попытался очистить любую выходную буферизацию от идеи, что Drupal может слишком сильно пытаться поддерживать Unicode или что-то в этом роде, но это тоже не помогло.

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

Update 1:

я соединял некоторые примеры кода, но не обнаруживали ошибки; Я могу преобразовать код в модуль Drupal, чтобы проверить этот стек кода. Тем не менее, я сузил ошибку до echo $fileData. Код выглядит примерно так:

function example_menu() { 
    $pages['mpicture/%'] = array(
    'title' => 'Picture handler', 
    'page callback' => 'example_picture', 
    'page arguments' => array(1), 
    'delivery callback' => 'example_deliver_png', 
    'access callback' => TRUE, 
    'type' => MENU_CALLBACK, 
); 
} 

function example_picture($fileID) { 
    // Point 1 
    example_output_file($fileID); 
} 

function example_deliver_png($content) { 
} 

function example_output_file($fileID) { 
    $statement = db_select('mfiles', 'f') 
    ->fields('f', array('fileType', 'fileSize', 'fileData', 'fileData64', 'lastModified')) 
    ->condition('fileID', $fileID, '=') 
    ->execute(); 

    if ($file = $statement->fetchAssoc()) { 
    header('Content-Type: ' . $file['fileType']); 
    // Point 2 
    header('Content-Length: ' . $file['fileSize']); 
    echo $file['fileData']; 
    } 
} 

Это не работает. Если изменить Point 2 к этому:

// Point 2 
    header('Content-Length: ' . $file['fileSize']*4/3); 
    echo $file['fileData64']; 

Он работает правильно, до тех пор, как мой клиент запускает base64_decode на выходе. Однако, если я делаю это:

// Point 1 
    ob_start() 
    example_output_file($fileID); 
    $output = base64_encode(ob_get_clean()); 
    header('Content-Length: ' . strlen($output)); 
    echo $output; 

... он не работает с клиентом ИНГ же base64_decode. Как это могло быть?

И да, я храню данные дважды; в каждом отдельном тесте, который я запускаю, неважно, пользуюсь ли я $file['fileData'] или base64_decode($file['fileData64']), поэтому я не думаю, что это проблема с базой данных.

Update 2:

Но любопытно, что это работает:

// Point 1 
    ob_start() 
    example_output_file($fileID); 
    $output = base64_encode(trim(ob_get_clean())); 
    header('Content-Length: ' . strlen($output)); 
    echo $output; 

Так что, я думаю, теперь я пытаюсь найти, где белое пространство печатается?

+0

Вы можете отправить свой вопрос на [drupal.stackexchange.com] (drupal.stackexchange.com). – stefgosselin

+0

На этом этапе я почти уверен, что это не вещь Drupal, потому что я меняю все заголовки и стираю выходные буферы, поэтому Drupal не должен испортить вывод. Кроме того, каждый раз, когда я писал что-то на [drupal.stackexchange.com] (http://drupal.stackexchange.com/), он никогда не получал никаких ответов или комментариев; Я чувствую, что большинство людей Drupal поддерживают официальные форумы поддержки. Во всяком случае, я упомянул только о том, что Дрюпал попытался охватить все возможности. – meustrus

+0

Если вы посмотрите на двоичный файл необработанного изображения, можете ли вы проверить, есть ли какие-либо ошибки HTML-кода html? –

ответ

1

Я собираюсь задушить стажера. Клянусь. Не совсем, это выражение ... но я злюсь.

Вся проблема была в том, что новый файл, который он добавил, имел пустое пространство в конце его. Простой «?> \ N". Это печатное белое пространство перед каждой страницей на сервере, включая обработчик изображения. Пробел сделал изображение поврежденным.

Я думаю, что мораль здесь никогда не закрывает теги PHP в конце файлов, и черт не сомневаюсь, что все, с кем вы работаете, делают то же самое.

+0

Этот пост просто спас мой день. У меня была одна и та же проблема, только я сделал это сам, скопировав что-то в спешке. За 15 минут кодирования осталось 2 пробела после закрывающего тега php, что привело к 3 часам отладки. Grr. –

+0

Просто рада, что прошло всего 3 часа, а не целую неделю. И помните, вам не нужно закрывать теги PHP в конце файлов. Это совершенно верно и фактически в стиле проектов Zend (или так я слышал): '') – meustrus

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