2010-04-12 4 views
2

В настоящее время у меня возникают проблемы с загрузкой пользователем файла, хранящегося на моем сервере. У меня есть код для автоматической загрузки файла, как только пользователь нажимает кнопку загрузки. Он работает для всех файлов, но когда размер get превышает 30 МБ, у него возникают проблемы. Есть ли ограничение на загрузку пользователя? Кроме того, я предоставил свой пример кода, и мне интересно, есть ли более эффективная практика, чем использование функции PHP «file_get_contents».Вопросы по загрузке файлов PHP

Спасибо всем за помощь!

$path = $_SERVER['DOCUMENT_ROOT'] . '../path/to/file/'; 
$filename = 'filename.zip'; 
$filesize = filesize($path . $filename); 
@header("Content-type: application/zip"); 
@header("Content-Disposition: attachment; filename=$filename"); 
@header("Content-Length: $filesize") 
echo file_get_contents($path . $filename); 
+1

Я не PHP эксперта, но вы пробовали увеличение лимита памяти сценария. –

ответ

1

file_get_contents() тянет файл содержимое в PHP VM. Используйте файл readfile(), чтобы передать его, не читая его.

6

file_get_contents() загрузит весь файл в память - используя его журнал.

И, в PHP, объем памяти, скрипт может использоваться ограничен (см memory_limit) - который мог бы объяснить, что ваша загрузка скрипт не работает для больших файлов.


Использование вместо этого readfile() может быть лучшим выбором: он будет читать файл и напрямую отправлять его содержимое в выходной буфер.

Это означает:

  • Не загружая весь файл в память
  • Не имея эхо содержания вы загруженные в памяти.

Просто используя что-то, как это должно быть в порядке:

$path = $_SERVER['DOCUMENT_ROOT'] . '../path/to/file/'; 
$filename = 'filename.zip'; 
$filesize = filesize($path . $filename); 
@header("Content-type: application/zip"); 
@header("Content-Disposition: attachment; filename=$filename"); 
@header("Content-Length: $filesize") 
readfile($path . $filename); 


(BTW: действительно ли вы хотите, чтобы заставить замолчать ошибка позиционирования таким образом, с оператором @ Другим решением может быть, чтобы не отображать им, но войти в файл - см display_errors, log_errors и error_log)

+0

Паскаль, Спасибо за помощь и отличную информацию. Похоже, мой лимит скрипта достаточно велик, и функция readfile работает нормально. Я удалил оператор @, чтобы снова включить ошибки. Хотя, у меня все еще возникают проблемы с загрузкой больших файлов. Есть еще мысли? – nsearle