Вопросы по загрузке файлов PHP - PullRequest
2 голосов
/ 12 апреля 2010

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

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

$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);

Ответы [ 2 ]

6 голосов
/ 12 апреля 2010

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);


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

1 голос
/ 12 апреля 2010

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

...