Загрузка больших файлов на сайт

Довольно часто на форумах можно встретить вопрос: “Как залить через WEB интерфейс файл размером 10 Mb? При попытках это сделать возникают какие-то ошибки“. Если вы столкнулись с аналогичной проблемой, то данная заметка именно для вас.

Конфигурационный файл PHP php.ini имеет несколько директив, связанных с загрузкой файлов на сервер:

  • file_uploads=On — разрешает загрузку файлов на сервер по протоколу HTTP;
  • upoad_tmp_dir=/tmp — устанавливает каталог для временного хранения загруженных файлов;
  • upload_max_filesize=2M — устанавливает максимальный объем загружаемых файлов;
  • post_max_size=2M — устанавливает максимальный допустимый размер POST-данных. Это свойство также влияет на закачиваемые файлы. Чтобы закачивать большие файлы, это значение должно быть выше upload_max_filesize.

Если в вашем конфигурационном скрипте включено ограничение памяти, memory_limit также будет влиять на закачивание файлов. Проще говоря, memory_limit должна быть больше чем post_max_size.

Итак, редактируем файл php.ini:

post_max_size=10M
upload_max_filesize=10M

Также бывает полезно увеличить значение переменных PHP max_input_time и max_execution_time (время приема данных и выполнения скрипта):

max_input_time=600
max_execution_time=600

Ссылки по теме:

Комментариев: 13

  1. Alex:

    Более актуальный вопрос - как залить на сервер файл до 2 гигов. В этом случае такие настройки уже не помогут :(

  2. admin:

    Alex, хостеры, как правило, не предоставляют дисковое пространство более 1Гб.

  3. Mikhail:

    admin: на hc.ru есть нормальный тариф “Большой”, там дают 5 ГБ.

  4. Jizus CREED:

    я прошу прощения, но недавно у меня у самого возникла необходимость увеличить max_execution_time. Так вот - некоторые настройки php нельзя переопределять в .htacess. В том числе чельзя менять max_execution_time. Про остальное не помню но сильно подозреваю что все это менять тоже нельзя (там насколько я помню ничего из такого более-менее глобального менять было нельзя)

  5. admin:

    Jizus CREED, вы правы. Хостер едва ли позволит менять эти настройки. Ведь мы имеем дело с виртуальным хостингом, когда на одном сервере могут быть десятки сайтов. И все ресурсы должны распределяться примерно поровну. И если кто-то один начнет использовать ресурсы по полной, то у других сайты начнут тормозить. Обычно, если такая ситуация возникает, то предлагают перейти на более дорогой тариф, где на одном сервере два-три сайта или вообще арендовать выделенный сервер.

  6. Jizus CREED:

    Извените но дело не в хостере)) (про нецелесообразность разрешения этого для хостера итак понятно))) )
    Все директивы в пхп делятся на те которые можно переопределять в .htaccess и нельзя (таблица есть на php.net, извените, точный линк не помню). Так вот - конкретно max_execution_time в .htaccess переопределять нельзя впринципе. И хостер не сможет это разрешить при всем желании, таков уж двиг пхп.
    я это к тому что приведенный вами пример не то что не будет работать почти нигде. Он не будет работать вообще нигде в принципе)))
    Насколько я помню так же ситуация обстоит и с post_max_size и upload_max_filesize

  7. admin:

    Все директивы в пхп делятся на те которые можно переопределять в .htaccess и нельзя
    Да, я понял о чем Вы говорите. Мое упущение - слона-то я и не заметил :)

  8. Alex:

    Файлы больших размеров (до 2Гб) можно отправлять:
    a) по кусочкам - для этого нужен Java апплет, или Flash или Google Gears
    б) сделать свой обработчик для подобных запросов, которому будет плевать на все ограничения

    для б) естественно нужно иметь VDS и смотреть в сторону питона, там по-моему не так сложно написать свой собственный специализированный HTTP сервер.
    для а) апплет мне где-то попадался бесплатный, но увы не устраивал по некоторым по казателям, Flash Uploader’ы как назло либо платные, либо не умеют резать файл дольками. Так что я у себя на webutils.info использовал Google Gears. Если нужно, клиентская часть там вся на виду в JavaScript, серверная достаточно тривиальна - можно догадаться как делать. Есть очевидный минус - клиент должен установить плагин Google Gears, который к тому же есть не для всех браузеров (Опера насколько я помню идет лесом)

    Сейчас думаю о VDS и о варианте б

  9. Александр:

    RE: б) сделать свой обработчик для подобных запросов, которому будет плевать на все ограничения

    И каким образом Вы собираетесь реализовывать данный обработчик?
    У меня сейчас стала такая же проблема. Сервер свой есть.. Нужно файлы нелимитированного объема туда загружать… А вот хз как это сделать по правильному…

    Если кто подскажет спасибо огромное-)

  10. Алексей:

    Не совсем понятно в чем проблема читать файл по кускам, передавать в посте эти маленькие кусочки и контрольную сумму, затем на удаленном сервере сверять контрольную сумму и дописывать в конец файла
    Таким образом на 32 разрядной системе со стандартными настройками php получится записать файл размером до 2Гб. Если надо больше, то надо пересобирать php. Как это сделать можно узнать погуглив ошибку =)

  11. admin:

    Алексей, идея хорошая, а как быть, если речь идет об обычном пользователе? Порезать файл для него - проблема.

  12. Stanislav:

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

  13. AD:

    2Jizus CREED
    Прежде чем писать такое “Так вот - конкретно max_execution_time в .htaccess переопределять нельзя впринципе.”, изучит мануал.

    а то вводите в заблуждение других.
    max_execution_time “30″ PHP_INI_ALL

    PHP_INI_ALL = Опция может быть установлена где угодно

Оставьте свой отзыв