Многие сталкивались с проблемой при закачке файлов, что сервер упорно пытается загрузить слишком большие для нас файлы и этот процесс не только тормозит пользователя, заставляя его понапрасну долго ждать, но и загружает сам сервер, на который происходит закачка файла.
Для серверов Apache с установленным на них PHP можно ограничить такой процесс 2мя способоми:
Мне бы хотелось рассмотреть именно его.
Итак, начнем с того, что укажем в форме
В значении элемента MAX_FILE_SIZE указываем нужный нам максимальный размер в байтах загружаемых файлов.
Особое внимание нужно обратить на то, что этот элемент должен стоять ДО полей выбора файлов (например, сразу после тега form):
Пример:
Что происходит на практике (хотя некоторые конфигурации PHP и Apache запрещают данный метод):
PHP получает первым делом наш параметр ограничения размера файлов. Далее считывает его значение, далее «сбрасывает» элементы массива $_FILES, где размер файла превышал необходимый.
Пример того, что он творит с таким элементом:
Как видим он ставит для такого элемента код ошибки отличный от 0 (0 = удачная загрузка), данная ошибка гласит: «The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form» или «Размер загруженного файла превысил значение MAX_FILE_SIZE, установленное в HTML форме».
Внимание:
подробное описание механизма на php.net
ЗЫ: Надеюсь, данная статья поможет многим кодерам, особенно тем, кто не имеет прав сервера на изменение настроек PHP на сервере.
ЗЗЫ: В своем топике я просто хотел описать один из механизмом и свой опыт его использования. Это не в коем случае НЕ пособие к обязательным действиям, так как он всего лишь является дополнительным, в каких-то случаях удобным, механизмом проверки.
ЗЗЗЫ: Отредактирован с учетом выссказываний, пожеланий, споров и советов в комментариях.
Для серверов Apache с установленным на них PHP можно ограничить такой процесс 2мя способоми:
- ограничить закачку файла настройками самого PHP
- ограничить закачку файла используя механизмы отправки запроса формы на сервер (только методом 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.net
ЗЫ: Надеюсь, данная статья поможет многим кодерам, особенно тем, кто не имеет прав сервера на изменение настроек PHP на сервере.
ЗЗЫ: В своем топике я просто хотел описать один из механизмом и свой опыт его использования. Это не в коем случае НЕ пособие к обязательным действиям, так как он всего лишь является дополнительным, в каких-то случаях удобным, механизмом проверки.
ЗЗЗЫ: Отредактирован с учетом выссказываний, пожеланий, споров и советов в комментариях.