Я пытался создать форму загрузки файла и проверил документацию PHP, чтобы обновить мою память по этому вопросу. Вот ссылка на соответствующую статью. Внезапно я заметил это сообщение:
Скрытое поле MAX_FILE_SIZE (измеренное в байтах) должно предшествовать поле ввода файла, а его значение – максимальный размер файла, принятый PHP. Этот элемент формы всегда должен использоваться, поскольку он избавляет пользователей от необходимости ждать передачи большого файла только для того, чтобы обнаружить, что он слишком велик, и передача не удалась. Имейте в виду: обмануть этот параметр на стороне браузера довольно просто, поэтому никогда не полагайтесь на файлы с большим размером, которые блокируются этой функцией. Это просто удобная функция для пользователей на клиентской стороне приложения. Однако настройки PHP (на стороне сервера) для максимального размера не могут быть обмануты.
Хорошо … Скажи что? Сначала он сообщает, что он должен предшествовать полю загрузки файла. Затем он говорит нам, что это просто для удобства. И к тому же – это на стороне клиента, так что любой может с ним пообщаться. После googling вокруг я также нашел информацию, что нет известных браузеров, которые ее поддерживают.
WTF? Почему он сказал, что он должен предшествовать полю загрузки файла, если он кажется (по сути, совершенно бессмысленным)? Должен ли я вообще поместить его в свой HTML?
На данный момент нет браузеров, которые действительно заботятся о директиве MAX_FILE_SIZE, поэтому это довольно бессмысленно. Я полагаю, что это дает вам более подробный контроль над максимальными размерами при загрузке (как выше, чем выше), а не с php.ini, но лично я просто игнорирую его, и вы, вероятно, тоже должны это сделать. Это, конечно же, не остановит пользователя, загружающего больший, чем требуется файл – руководство в этом отношении довольно вводит в заблуждение.
После неудачной попытки найти какую-либо авторитетную информацию о MAX_FILE_INFO я решил прибегнуть к решительным мерам – и заглянул в священный источник PHP.
Я проверил весь PHP-источник рекурсивно с помощью grep:
grep -ri MAX_FILE_SIZE .
Единственное место, где упоминалось эта переменная, было (исключая папку test) – файл rfc1867.c. Полностью ожидаемый, поскольку стандарт rfc1867 касается загрузки файлов.
Связанный код C:
...... if (!strcasecmp(param, "MAX_FILE_SIZE")) { max_file_size = atol(value); } ...... ...... if (PG(upload_max_filesize) > 0 && (total_bytes+blen) > PG(upload_max_filesize)) { cancel_upload = UPLOAD_ERROR_A; } else if (max_file_size && ((total_bytes+blen) > max_file_size)) { cancel_upload = UPLOAD_ERROR_B; } else if ....
Итак – вот короткое объяснение вышеприведенного кода:
1) сначала мы получаем значение MAX_FILE_SIZE в переменную max_file_size.
2) Затем мы проверяем, существует ли значение max_file_size и если сумма уже принятых байтов (total_bytes) + размер байтов в буфере (blen) превышает max_file_size.
3) Если 2 истинно – в этот момент мы отменяем загрузку с некоторым кодом ошибки, который был установлен этой константой: UPLOAD_ERROR_B
НО – как вы можете видеть – прямо перед проверкой переменной max_file_size – PHP выполняет ТОЧНО ОЧЕНЬ ПРОВЕРКУ для переменной upload_max_filesize !!! Так что у нас это.
Вывод: IMHO-op прав – в ваших формах есть 0 баллов, включая MAX_FILE_SIZE! Просто установите upload_max_filesize в файл php.ini или динамически с помощью ini_set ().
Пока мы не найдем браузеры, которые его поддерживают, на стороне клиента нет смысла.
Однако на стороне сервера MAX_FILE_SIZE
влияет на значения, которые вы получаете из $_FILES['your_file']
.
Предполагая, что запрос браузера действительно прошел через post_max_size
, обычно это то, что дает PHP:
array(5) { ["name"]=> string(11) "my_upload.dll" ["type"]=> string(24) "application/x-msdownload" ["tmp_name"]=> string(26) "C:\WINDOWS\Temp\php86A.tmp" ["error"]=> int(0) // UPLOAD_ERR_OK ["size"]=> int(238592) }
Но если размер загруженного файла превышает MAX_FILE_SIZE
, вы увидите:
array(5) { ["name"]=> string(11) "my_upload.dll" ["type"]=> string(0) "" ["tmp_name"]=> string(0) "" ["error"]=> int(2) // UPLOAD_ERR_FORM_SIZE ["size"]=> int(0) }
А часть « MAX_FILE_SIZE
должна предшествовать поле ввода файла» не является шуткой. Это действительно работает, потому что PHP будет последовательно интерпретировать полезную нагрузку запроса POST
браузера:
<input name=F1 type=file> <input name=F2 type=file> F1 and F2 will not be affected by MAX_FILE_SIZE <input name=MAX_FILE_SIZE value=1024 type=hidden> <input name=F3 type=file> <input name=F4 type=file> F3 and F4 will have MAX_FILE_SIZE = 1024 bytes <input name=MAX_FILE_SIZE value=0 type=hidden> <input name=F5 type=file> <input name=F6 type=file> F5 and F6 will have MAX_FILE_SIZE = 0 (infinite) <input name=MAX_FILE_SIZE value=1 type=hidden> <input name=F7 type=file> <input name=F8 type=file> F7 and F8 will have MAX_FILE_SIZE = 1 byte
Также обратите внимание, что PHP интерпретирует MAX_FILE_SIZE
регистр maX_fILe_sIZE
, поэтому maX_fILe_sIZE
и Max_File_SIZE
тоже будут работать.
Я полагаю, что смысл в том, что совместимые браузеры будут препятствовать отправке формы в случае, когда пользователь выбрал слишком большой файл, что позволит им сохранить хотя бы частичную загрузку (которая может занять некоторое время) файла, который был будет отклонено.
На стороне сервера PHP все еще проверяет и применяет различные ограничения, установленные в PHP.ini, и будет ссылаться на то, что загрузка была слишком большой в обычном режиме, то есть код ошибки, установленный в $ _FILES. Вы можете подумать о поле как о аналогии с проверкой JavaScript – мы можем сделать быструю проверку на стороне клиента для удобства пользователя, но мы по-прежнему делаем правильный серверный тест и применяем его для всех запросов.
Как заявили другие, не существует каких-либо браузеров, которые действительно пытаются выполнить эту проверку, делая ее относительно бесполезной.
Ниже следует, что я ошибаюсь, пожалуйста, прочитайте другие ответы, которые лучше информированы и точны (AFAIK).
Я думаю, что дело в том, что в нем говорится:
Этот элемент формы всегда должен использоваться, поскольку он избавляет пользователей от необходимости ждать передачи большого файла только для того, чтобы обнаружить, что он слишком велик, и передача не удалась
Да, его можно обмануть, и поэтому не следует полагаться на то, чтобы предотвратить загрузку больших файлов, но для незванных пользователей, если загруженный файл больше, чем целое число в этом поле, PHP запрещает эту загрузку и представляет ошибку код в массиве $_FILES
(источник – комментарии на php.net ).
Я использую его для установки ограничения размера файла, когда конкретному приложению нужны файлы меньшего размера, чем предел в php.ini
. Мои скрипты php проверяют его, но он установлен в HTML-форме. Различные формы имеют разные размеры файлов. Я не уверен, что это имеет много общего с предполагаемым использованием, но это упрощает повторное использование моих сценариев. Было бы хорошо, если бы его можно было проверить на уровне браузера, но это не единственная причина, по которой это полезно.