Загруженный файл слишком большой для обработки сервером

Обновлено: 04.07.2024

Содержание

Кто может ограничивать объём загружаемых файлов?

Как может быть ограничен объём загружаемых файлов?

Например, если Вы увеличите объём загружаемых данных до 100 МБ и в каком-то поле в одной из форм Вашего сайта, не связанной с загрузкой файлов, а, к примеру, связанной с модификацией данных о пользователе, Вы передаёте какой-нибудь числовой идентификатор (к примеру, номер месяца дня рождения этого пользователя, который, по идее дожен быть числом от 1 до 12), который подставляете в SQL-запрос, то Вам следует приготовиться, что злой хакер передаст в этом поле не число от 1 до 12, а загрузит туда все 100 МБ. Если Вы не настроили Ваш сервер баз данных на обработку очень больших запросов (по умолчанию в My SQL это порядка 16 МБ), то такой запрос приведёт к ошибке, которую и будет эксплуатировать хакер.

  • значительное увеличение времени выполнения Ваших скриптов может снизить защищённость Вашего сервера. Например, это может упростить выполнение DoS-атаки, основанной на том, что большое количество скриптов запускаются и выполняют какие-нибудь длинные бесполезные, на занимающие процессорное время задачи. Если время выполнения скриптов маленькое, то для эффективной DoS-атаки следует постоянно перезапускать скрипты (для защиты в таком случае часто используются блокировки, учитывающие количество обращений с заданного IP-адреса). Если же скрипты выполняются долго, то запустив скрипт однажды, о перезапуске скриптов можно долго не беспокоиться и простой подсчёт количества обращений становится бесполезным.

Внимание! Этот список не является списком всех возможных уязвимостей, которые могут появиться при перенастройке Ваших программ для увеличения объёма передаваемых на сервер файлов.

В связи с чем появилась проблема?

Этот протокол, однако, позволяет передавать данные от пользователю серверу. Это сделано для того, чтобы сервер мог динамически генерировать страницы, в зависимости от пришедших данных. К примеру, сам Apache поддерживает возможность вывода списка файлов, позволяя пользователям пересортировывать этот список разными способами. Способ сортировки задаётся в переменной, которая передаётся методом GET.

Но передача методом GET обладает некоторыми недостатками. Например, с его помощью нельзя передавать важную, конфиденциальную информацию, так как адрес страницы (вместе со всеми переменными, которые переданы этим методом), показывается в адресной строке браузера и записывается в журналы прокси-серверов.

Когда Вы программируете под Интернет, Вам следует всегда помнить, что

Это всё потому, что:

  • FTP предназначен для передачи любых файлов в любом направлении
  • FTP НЕ предназначен для передачи гипертекстовых страниц

Как добиться загрузки больших файлов?

Однозначного алгоритма, позволившего бы Вам увеличить объём загружаемых файлов нет, поскольку эти объёмы ограничиваются неопределённым набором используемых Вами программ неопределённым набором способов. Некоторые из этих программ и некоторые используемые ими способы ограничения объёмов файлов перечислены выше.

В первую очередь попробуйте увеличить значения настроек, ссылки на описание которых есть в разделе «Как может быть ограничен объём загружаемых файлов?».

Не забывайте, что настройки используемых Вами программ могут быть прописаны в большом количестве разных мест, при этом могут учитываться все настройки, с учётом приоритета мест.

Следует помнить, что max_execution_time и max_input_time могут быть одинаковыми на разных серверах, но на более быстром сервере за это время большой файл успеет загрузиться, а на медленном сервере (или на том же сервере, но в моменты пиковой загрузки, когда к серверу обращается много пользователей), при тех же настройках тот же файл уже не загрузится.

Встречались также случаи, когда на компьютере хранится несколько копий файлов настроек и программист меняет один из них, а сервер загружает другой. Часто меняют настройки и забывают после этого перезагрузить сервер.

Если не поможет изменение настроек – следуйте рекомендациям раздела «Кто может ограничивать объём загружаемых файлов?», то есть изучите все настройки (а не только описанные в этой статье) во всех используемых Вами программах. Можете начать с поиска всех настроек, в которых встречается слово upload или limit. Потом посмотрите все остальные.

Если и это Вам не поможет, значит, скорее всего где-то Вы допустили ошибку: либо неправильно прописали настройки, либо Ваши настройки переопределяются в каком-то другом месте, либо их изменение запрещено другими настройками, либо о каких-то настройках не прочитали.

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

Простое решение проблемы

Для загрузки больших файлов на сервер используйте FTP.

Решение, предложенное Кром.

На локальном компьютере ставится простейший ftp. На сервере прописываешь ip, логин и пароль. Если крона нет, то просто по обращению к странице на сервере проверяешь локальный ftp, закачиваешь файлы на серер, автоматически делаешь ссылки и т.д. Т.е. вообще без всякого вмешательства все работает.

Если понадобится описание файлов и какая-то дополнительная информация, то заходишь в админку и добавляешь необходимые данные. При этом на странице тебе выдается весь список закачанных файлов или тех, которые еще находятся на локальном ftp. Под ними поля для дополнительной информации, чекбоксы и т.д. Заполнил всё, нажал ОК и пошёл курить. Программа сама докачает необходимые файлы и выложит их в публичный доступ. Смотрите также

Полезные статьи по загрузке файлов на сервер

Upload файлов, и все с этим связанное

Программы, которые могут Вам помочь

File Upload Applet

Mega Upload Progress Bar

Благодарности

Кром. Способ загрузки больших файлов, если у Вашего локального компьютера есть выделенный IP и Вы сами закачиваете файлы на сервер.

Давайте разберёмся, где именно находятся эти самые настройки и как их можно изменить. Оговорюсь сразу, что в данной статье речь пойдёт о локальном сервере DENWER, а ни о каком-либо ином. Если Вы используете другой локальный сервер, то данная статья Вам даст лишь только понимание того что нужно сделать, потому как точное название и местонахождение файла (возможно, нескольких файлов) с настройками того локального сервера что Вы используете, скорее всего, будет отличаться от тех, которые мы рассмотрим здесь.

Разочарование от того, что у нас ничего не получилось начинается с фразы:

Вероятно, размер загружаемого файла слишком велик. Способы обхода данного ограничения описаны в документации.

которую мы имеем счастье лицезреть на картинке следующего вида:

Если в процессе импортирования базы Вы столкнулись с нечто подобным, то следует открыть файл php.ini. Он расположен по следующему адресу:

Z:/usr/local/php5/php.ini

Первая буква (Z) может быть иной, потому как при установке локального сервера DENWER можно выбирать любую, не занятую под уже имеющиеся у Вас диски букву и тут уж Вам виднее какую букву выбрали Вы. А дальнейший путь будет в точности совпадать.

Далее при помощи любого редактора кода открываем файл php.ini. Лучше это сделать при помощи редактора Notepad++, но если он у Вас не установлен, можно открыть при помощи редактора кода Блокнот, который входит в стандартную поставку системы Windows и не требует дополнительной установки.

К стати! Если вдруг кто то не в курсе, то редактор Notepad++ является бесплатной программой и скачать его можно на официальной странице .

Затем, при помощи поиска, в файле php.ini следует отыскать месторасположение следующих трёх переменных, меняя значения которых, можно изменять размер импортируемой базы:

upload_max_filesize; post_max_size; memory_limit

Забегая вперёд, скажу, что там будут ещё и четвёртая и пятая переменные, но о них чуточку позже.

По умолчанию (в Мегабайтах) эти переменные имеют следующие значения:

- upload_max_filesize – 2M

- post_max_size – 8M

- memory_limit – 128M

upload_max_filesize – это и есть та самая переменная, значение которой ограничивает максимальный размер импортируемой базы. По умолчанию, это ограничение составляет 2 Мегабайта. Если импортируемая Вами база больше этого значения, то его следует соответственно увеличить. Но также следует следить и за значениями переменных post_max_size и memory_limit. Они не должны быть меньше переменной upload_max_filesize.

Пример: Предположим нам следует импортировать базу размером 10 Мегабайт. В таком случае, для переменных, с учётом некоторого запаса нам следует выбрать приблизительно следующие значения: upload_max_filesize – 12M
post_max_size – 16M
memory_limit – 128M

После чего, любую базу размером до 10МГбайт можно будет импортировать, не опасаясь столкнуться с вышеописанной проблемой.

Теперь о тех самых четвёртой и пятой переменных, про которые я обещал рассказать Вам немного позже. Совершенно очевидно, что увеличение размера загружаемой базы, связано с соответствующим увеличением времени на её загрузку. Это время так же можно менять. Оно находится в переменной max_execution_time (это четвёртая переменная). Время загрузки задаётся в секундах (хотя там нет никаких единиц измерения). По умолчанию эта переменная равна 30 секундам:

max_execution_time = 30

На момент написания статьи у меня не было случаев, что бы мне не хватило времени на загрузку какой-либо базы данных, поэтому я значение этой переменной не менял. Возможно это потому, что я не сталкивался с импортом баз данных объёмом более 6-7 Мегабайт. Но, быть может у Вас возникнет такая ситуация, так что имейте это ввиду. И если решите увеличить время на загрузку в переменной max_execution_time, то в таком случае не забывайте отслеживать значение ещё одной (пятой) переменной. Зовут её max_input_time и по умолчанию её значение равно 60 секунд:

max_input_time = 60

Переменная max_input_time всегда должна иметь большее значение, чем max_execution_time.

Многие сталкивались с проблемой при закачке файлов, что сервер упорно пытается загрузить слишком большие для нас файлы и этот процесс не только тормозит пользователя, заставляя его понапрасну долго ждать, но и загружает сам сервер, на который происходит закачка файла.

  1. ограничить закачку файла настройками самого PHP
  2. ограничить закачку файла используя механизмы отправки запроса формы на сервер (только методом POST)

Мне бы хотелось рассмотреть именно его.
Итак, начнем с того, что укажем в форме method="post" и enctype="multipart/form-data" . Далее создадим скрытый элемент формы
<input type="hidden" name="MAX_FILE_SIZE" value="1111111">

В значении элемента MAX_FILE_SIZE указываем нужный нам максимальный размер в байтах загружаемых файлов.
Особое внимание нужно обратить на то, что этот элемент должен стоять ДО полей выбора файлов (например, сразу после тега form):

Пример:
<form method="post" . enctype="multipart/form-data">
<input type="hidden" name="max_file_size" value="1111111">
.
<input type="file" name="photo" >
.
</form>

Что происходит на практике (хотя некоторые конфигурации PHP и Apache запрещают данный метод):
PHP получает первым делом наш параметр ограничения размера файлов. Далее считывает его значение, далее «сбрасывает» элементы массива $_FILES, где размер файла превышал необходимый.

Пример того, что он творит с таким элементом:
Array ( [photo] => Array ( [name] => my_photo.jpg [type] => [tmp_name] => [error] => 2 [size] => 0 )

Как видим он ставит для такого элемента код ошибки отличный от 0 (0 = удачная загрузка), данная ошибка гласит: «The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form» или «Размер загруженного файла превысил значение MAX_FILE_SIZE, установленное в HTML форме».

  • некоторые браузеры могут (пользуясь данной директивой) сами обрывать закачку файла на сервер (природа данного эффекта мне лично не известна и в документациях браузеров про нее не нашел)
  • это НЕ обязательная директива для браузеров
  • в браузерах данное ограничение можно легко обойти
  • в Mozilla Firefox (тестировалось на версиях 2 и 3) ограничение на стороне браузера не срабатывало
  • в IE начиная с 6ой версии (на ниже версиях не тестировал) и Opera (начиная с 8.5ой версии) работало
  • в теории (сам не проверял) параметр ограничение через форму MAX_FILE_SIZE приоритетнее параметра upload_max_filesize в php.ini

ЗЫ: Надеюсь, данная статья поможет многим кодерам, особенно тем, кто не имеет прав сервера на изменение настроек PHP на сервере.

ЗЗЫ: В своем топике я просто хотел описать один из механизмом и свой опыт его использования. Это не в коем случае НЕ пособие к обязательным действиям, так как он всего лишь является дополнительным, в каких-то случаях удобным, механизмом проверки.

ЗЗЗЫ: Отредактирован с учетом выссказываний, пожеланий, споров и советов в комментариях.

Загрузка файлов больших размеров в PHP

Те, кто уже пытался загружать файлы, вполне вероятно, обратили внимание на то, что загрузить файл через PHP даже среднего размера (15-20 МБ) не представляется возможным. А ведь это не такой уж и большой размер файла, и в этой статье я расскажу, как загружать файлы больших размеров в PHP.

  • max_execution_time - максимальное время, которое может выполняться скрипт. Как правило, стоит 30-60 секунд.
  • max_input_time - максимальное время, в течение которого могут приниматься данные на сервер. Здесь также стоит порядка 30-60 секунд.
  • upload_max_filesize - максимальный размер файла, который допускается для загрузки на сервер. Ключевая настройка, однако, вопреки общему заблуждению, далеко не единственная необходимая для загрузки больших файлов в РHP.
  • post_max_size - максимальный размер отправляемых данных.

php_value max_execution_time 500
php_value max_input_time 500
php_value upload_max_filesize 30M
php_value post_max_size 30M

Почему все 4 опции так важны:

Однако, будьте внимательны! До бесконечности увеличивать эти параметры нельзя! Все эти настройки ограничены оперативной памятью, выделяемой Вам сервером. Запомните следующее неравенство, которое всегда должно соблюдаться: "upload_max_filesize < post_max_size < memory_limit". Вот поэтому нельзя поставить размер файла больше оперативной памяти. Возможно, Вы спросите почему? Здесь всё очень просто: прежде чем файл появится на сервере, он целиком помещается в оперативную память. И поэтому нельзя загрузить файл размера большего, чем оперативная память, выделяемая сервером. Надеюсь, понятно объяснил. А размер оперативной памяти составляет, в среднем, 64 - 128 МБ. И из этого размера Вы можете уже окончательно понять, насколько большие файлы Вы вправе загружать через PHP. Безусловно, если у Вас будет выделенный сервер, то Вы можете поставить хоть 16 ГБ оперативной памяти, если, конечно, на компьютере имеется столько памяти вообще. А на обычным хостинге, таких размеров не бывает, поэтому там всегда есть большие ограничения на размер загружаемых файлов через PHP. И всегда помните: предел на размер загружаемых файлов существует абсолютно всегда и на любом сервере!


Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

Комментарии ( 9 ):

У меня сайт на CMS Joomla. Добавил изменения в файл .htaccess в корне сайта, но желаемого результата не получил. Возмоджно, есть еще какие-то настройки или я неправильно записал php_value в .htaccess. Подскажите, плиз, какая может быть причина? Спасибо

Причина может быть в самой Joomla. В настройках Joomla есть параметр "Максимальный размер загружаемых файлов". Измените его. Также проблема может быть в Вашем хостинге, который не позволяет менять параметры через .htaccess.

Спасибо, Михаил. Буду пробовать.

Михаил, а вы можете написать статью про обрезку изображений?

Хорошо, напишу эту статью.

Данный вопрос вы можете задать своему хостеру. Но в целом да,скорее всего так и есть.Обычно размер аттача одного файла не может превышать 30-50 мегабайт


Какой файл будет считаться «слишком большим»? Это зависит от нескольких факторов:

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

Вне зависимости от происходящих событий вы должны быть в состоянии сделать следующее:

Файл слишком большой для WordPress

Как было отмечено выше, то, как вы определяете, является ли файл слишком большим для данной системы, зависит от многочисленных переменных окружения.

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

1. Задаем хук уведомлений.

Далее идет обычный ООП-код для WordPress:

Это обычное определение класса, в котором имя хука задано в конструкторе, а актуальная функция определена в классе. В нашем случае нам нужно будет немного поработать над подцепляемой функцией, чтобы определить, является ли файл слишком большим.

2. Проверяем размер файла на этапе загрузки

Обратите внимание: следующая функция предполагает, что вы уже имеете правильную обработку, позволяющую определить, заполнен ли массив $_FILES. Т.е., если пользователь пытается загрузить файл, но ничего не задает, то это уже отдельный случай для обработки.

В нашем случае пользователь предоставил файл, поэтому мы делаем следующее:

Наличие private функции, вычисляющей размер файла (есть и другие способы проверки типа и размера файла, но это выходит за рамки данной статьи), делает код намного более читабельным.

Я не говорю, что это – лучший способ задания проверки, но я действительно считаю, что когда дело доходит до поддержания кода – т.е. чтения его и работы с ним спустя месяцы или годы, – такой подход будет более простым.

3. Вывод ошибки (или загрузка файла).

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

Читайте также: