Загрузка больших файлов на сайт
Довольно часто на форумах можно встретить вопрос: “Как залить через 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
upload_max_filesize=10M
Также бывает полезно увеличить значение переменных PHP max_input_time и max_execution_time (время приема данных и выполнения скрипта):
max_input_time=600
max_execution_time=600
max_execution_time=600
Ссылки по теме:
Alex:
Более актуальный вопрос - как залить на сервер файл до 2 гигов. В этом случае такие настройки уже не помогут
7 Ноябрь 2008, 7:39admin:
Alex, хостеры, как правило, не предоставляют дисковое пространство более 1Гб.
7 Ноябрь 2008, 12:08Mikhail:
admin: на hc.ru есть нормальный тариф “Большой”, там дают 5 ГБ.
17 Ноябрь 2008, 12:54Jizus CREED:
я прошу прощения, но недавно у меня у самого возникла необходимость увеличить max_execution_time. Так вот - некоторые настройки php нельзя переопределять в .htacess. В том числе чельзя менять max_execution_time. Про остальное не помню но сильно подозреваю что все это менять тоже нельзя (там насколько я помню ничего из такого более-менее глобального менять было нельзя)
24 Декабрь 2008, 2:46admin:
Jizus CREED, вы правы. Хостер едва ли позволит менять эти настройки. Ведь мы имеем дело с виртуальным хостингом, когда на одном сервере могут быть десятки сайтов. И все ресурсы должны распределяться примерно поровну. И если кто-то один начнет использовать ресурсы по полной, то у других сайты начнут тормозить. Обычно, если такая ситуация возникает, то предлагают перейти на более дорогой тариф, где на одном сервере два-три сайта или вообще арендовать выделенный сервер.
24 Декабрь 2008, 10:38Jizus CREED:
Извените но дело не в хостере)) (про нецелесообразность разрешения этого для хостера итак понятно))) )
26 Декабрь 2008, 1:48Все директивы в пхп делятся на те которые можно переопределять в .htaccess и нельзя (таблица есть на php.net, извените, точный линк не помню). Так вот - конкретно max_execution_time в .htaccess переопределять нельзя впринципе. И хостер не сможет это разрешить при всем желании, таков уж двиг пхп.
я это к тому что приведенный вами пример не то что не будет работать почти нигде. Он не будет работать вообще нигде в принципе)))
Насколько я помню так же ситуация обстоит и с post_max_size и upload_max_filesize
admin:
Все директивы в пхп делятся на те которые можно переопределять в .htaccess и нельзя
26 Декабрь 2008, 10:33Да, я понял о чем Вы говорите. Мое упущение - слона-то я и не заметил
Alex:
Файлы больших размеров (до 2Гб) можно отправлять:
a) по кусочкам - для этого нужен Java апплет, или Flash или Google Gears
б) сделать свой обработчик для подобных запросов, которому будет плевать на все ограничения
для б) естественно нужно иметь VDS и смотреть в сторону питона, там по-моему не так сложно написать свой собственный специализированный HTTP сервер.
для а) апплет мне где-то попадался бесплатный, но увы не устраивал по некоторым по казателям, Flash Uploader’ы как назло либо платные, либо не умеют резать файл дольками. Так что я у себя на webutils.info использовал Google Gears. Если нужно, клиентская часть там вся на виду в JavaScript, серверная достаточно тривиальна - можно догадаться как делать. Есть очевидный минус - клиент должен установить плагин Google Gears, который к тому же есть не для всех браузеров (Опера насколько я помню идет лесом)
Сейчас думаю о VDS и о варианте б
11 Январь 2009, 8:55Александр:
RE: б) сделать свой обработчик для подобных запросов, которому будет плевать на все ограничения
И каким образом Вы собираетесь реализовывать данный обработчик?
У меня сейчас стала такая же проблема. Сервер свой есть.. Нужно файлы нелимитированного объема туда загружать… А вот хз как это сделать по правильному…
Если кто подскажет спасибо огромное-)
2 Февраль 2009, 20:57Алексей:
Не совсем понятно в чем проблема читать файл по кускам, передавать в посте эти маленькие кусочки и контрольную сумму, затем на удаленном сервере сверять контрольную сумму и дописывать в конец файла
18 Март 2009, 19:04Таким образом на 32 разрядной системе со стандартными настройками php получится записать файл размером до 2Гб. Если надо больше, то надо пересобирать php. Как это сделать можно узнать погуглив ошибку =)
admin:
Алексей, идея хорошая, а как быть, если речь идет об обычном пользователе? Порезать файл для него - проблема.
19 Март 2009, 10:24Stanislav:
У меня проблема с заливкой больших файлов решилась раздачей фтп на конкретного пользователя и веб интерфейса, который работал с юзерским фтп.
24 Апрель 2009, 4:28Иначе эта проблема решается уже приведенными здесь вариантами, которые не идеальны по умолчанию: резать файлы или делать собственный обработчик (изобретать велосипед).
Лучший вариант решения проблемы реализован всеми порталами по хранению файлов: аренда своего сервера (точнее серверов с распределением сетевой нагрузки).
AD:
2Jizus CREED
Прежде чем писать такое “Так вот - конкретно max_execution_time в .htaccess переопределять нельзя впринципе.”, изучит мануал.
а то вводите в заблуждение других.
max_execution_time “30″ PHP_INI_ALL
PHP_INI_ALL = Опция может быть установлена где угодно
12 Май 2011, 19:26