Вопросы по загрузке файлов PHP

В настоящее время у меня возникают проблемы с загрузкой пользователем файла, хранящегося на моем сервере. У меня есть код для автоматической загрузки файла, как только пользователь нажимает кнопку загрузки. Он работает для всех файлов, но когда размер get превышает 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); 

Solutions Collecting From Web of "Вопросы по загрузке файлов PHP"

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

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

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