2012-05-23 4 views
1

У меня есть приложение, которое использует Amazon S3 для хранения файлов. Я столкнулся с проблемой, когда большой PDF-файл не загружался с использованием хром. Меньшие PDF-файлы отлично работают, но это больше не будет работать. Я не думаю, что это проблема с PDF, я подозреваю, что он имеет отношение к размеру файла.Как вы принудительно загружаете файл с Amazon S3 с помощью SDK Amazon для PHP?

При просмотре файла в браузере здесь есть код, я использую:

header("Content-type: $filetype"); 
header("Content-Disposition: filename=\"".$filename."\""); 
$response = $s3->get_object(AMAZON_BUCKET, $filepath); 
echo $response->body; 

Это прекрасно работает для небольших файлов, но сегодня я столкнулся с проблемой, где этот большой PDF не показывать. Я думаю, что файл слишком велик, чтобы его можно было визуализировать. Поэтому я решил попытаться принудительно загрузить файлы, а не просматривать их в браузере, если они слишком большие. Итак, вот код, который я пытаюсь работать, но я должен делать что-то неправильно, потому что он не работает.

$response = $s3->get_object(AMAZON_BUCKET, $filepath, array(
     'response' => array(
     'content-type' => $filetype, 
     'content-disposition' => 'attachment' 
     ) 
    )); 

Как использовать Amazon SDK для PHP, чтобы заставить большой файл для загрузки?

+0

Возможно, у вашего PHP-скрипта закончилась нехватка памяти, если файл слишком велик. Вы проверили журнал ошибок (или включили ошибки отображения?) Получаете ли вы «ответ» вообще? Больше подсказок относительно того, где он ломается, может помочь. – Robbie

+0

Я увеличиваю память до 82 М. У файла, с которым у меня возникают проблемы, есть 43 mb. – Jason

+0

И другая часть вопроса: можете ли вы описать больше симптомов, которые она не работает? Получаете ли вы какой-либо resposne с сервера - ошибка 500, «предупреждение» или «уведомление». Что-нибудь в журналах? – Robbie

ответ

1

Проблема с вашим подходом заключается в том, что вы загружаете весь файл с S3 в память своего веб-сервера и затем отправляете его в браузер пользователя. Если файл большой, это может привести к превышению memory_limit или даже max_execution_time. (По общему признанию, я не знаю, почему ваш случай специфичен для Chrome.)

Более элегантным способом было бы перенаправить пользователя для загрузки файла непосредственно с S3. Вы можете даже set custom headers быть частью вашего запроса, чтобы вы могли принудительно установить диалог загрузки. Используйте get_object_url() вместо get_object().

+0

Спасибо за ваше предложение. Думаю, я переосмыслию то, как я это делаю. Интересная проблема заключается в том, что когда я беру URL-адрес, возвращаемый с amazon из get_object_url и помещаю этот url в chrome, он отменяется браузером. Если я сделаю то же самое в сафари, он загрузит файл. У вас есть идея, почему хром не загрузил бы его и сафари? – Jason

+0

Я добавил заголовки и исправил проблему с хромом. – Jason

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