Загрузка HTML MAX_FILE_SIZE не работает - PullRequest
36 голосов
/ 13 июня 2011

Мне интересно, как скрытое поле с именем MAX_FILE_SIZE должно работать?

<form action="" method="post" enctype="multipart/form-data">
    <!-- in byes must preceed file field -->
    <input type="hidden" name="MAX_FILE_SIZE" value="2097152" /> 
    <input type="file" name="upload" />

    <input type="submit" name="submit" value="Submit" />
</form>

Я загрузил файл размером 4 МБ +, но не получил предупреждения со стороны клиента (я не говорю о стороне сервера). Что это MAX_FILE_SIZE должно делать?

UPDATE

ОК, поэтому для PHP наложено «мягкое» ограничение. Но есть ли разница между его использованием и проверкой в ​​коде что-то вроде $_FILES['upload']['size'] < 2000?

Ответы [ 7 ]

43 голосов
/ 13 июня 2011

MAX_FILE_SIZE в КБ, а не байтов. Вы были правы, это в байтах. Итак, для ограничения в 4 МБ convert 4MB in bytes {1024 * (1024 * 4)} попробуйте:

<input type="hidden" name="MAX_FILE_SIZE" value="4194304" /> 

enter image description here

Обновление 1

Как объяснили другие, вы никогда не получите предупреждение за это. Это просто для того, чтобы установить мягкое ограничение на стороне сервера.

Обновление 2

Чтобы ответить на ваш подвопрос. Да, разница есть, вы НИКОГДА не доверяете пользовательскому вводу. Если вы хотите всегда накладывать ограничение, вы всегда должны проверять его размер. Не верьте тому, что делает MAX_FILE_SIZE, потому что это может изменить пользователь. Итак, да, вам следует убедиться, что он всегда больше или больше того размера, который вы хотите.

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

40 голосов
/ 06 апреля 2012

Прежде чем начать, пожалуйста, позвольте мне подчеркнуть, что размер файла должен быть проверен на стороне сервера .Если флажок не установлен на стороне сервера, злоумышленники могут переопределить ограничения на стороне клиента и загрузить огромные файлы на ваш сервер.НЕ ДОВЕРЯЙТЕ ПОЛЬЗОВАТЕЛЯМ.

Я немного поиграл с PHP MAX_FILE_SIZE, он работал только после загрузки файла, что делает его неактуальным (опять же, злонамеренный пользователь может переопределить его довольно легко).

Приведенный ниже код javascript (протестированный в Firefox и Chrome) на основе поста Мэтью предупредит пользователя (хорошего, невинного) априори о загрузке большого файла, сохраняя обатрафик и время пользователя:

<form method="post" enctype="multipart/form-data" 
onsubmit="return checkSize(2097152)">    
<input type="file" id="upload" />
<input type="submit" />

<script type="text/javascript">
function checkSize(max_img_size)
{
    var input = document.getElementById("upload");
    // check for browser support (may need to be modified)
    if(input.files && input.files.length == 1)
    {           
        if (input.files[0].size > max_img_size) 
        {
            alert("The file must be less than " + (max_img_size/1024/1024) + "MB");
            return false;
        }
    }

    return true;
}
</script>
7 голосов
/ 16 июля 2013

Для тех, кто был удивлен, что некоторые файлы легко загружаются, а некоторые нет, это может быть проблемой размера.Я делюсь этим, потому что застрял с моим PHP-кодом, не загружая большие файлы, и я продолжал предполагать, что он не загружал никаких файлов Excel.Итак, если вы используете PHP и хотите увеличить лимит загрузки файлов, перейдите в файл php.ini и внесите следующие изменения:

  • upload_max_filesize = 2M

следует изменить на

  • upload_max_filesize = 10M

  • post_max_size = 10M

или размертребуется.Затем перезапустите сервер Apache, и загрузка начнет работать волшебным образом.Надеюсь, это кому-нибудь поможет.

4 голосов
/ 13 июня 2011

На самом деле, это на самом деле не работает. Вы можете найти объяснение в одном из комментариев на странице руководства: http://www.php.net/manual/en/features.file-upload.php#74692

Ответ на обновленный вопрос: очевидное отличие состоит в том, что проверки на стороне сервера надежны, а проверки на стороне клиента - нет.

3 голосов
/ 14 июля 2016

Объяснение PHP.net о скрытом поле MAX_FILE_SIZE.

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

http://php.net/manual/en/features.file-upload.post-method.php

3 голосов
/ 13 июня 2011

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

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

Похоже, что встроенная поддержка загрузки в PHP - это единица для использования этого значения поля.

1 голос
/ 21 сентября 2012

Есть ТОЧКА во введении MAX_FILE_SIZE поля скрытой формы на стороне клиента.

php.ini может ограничивать размер загружаемого файла. Таким образом, хотя ваш скрипт учитывает ограничение, налагаемое php.ini, различные формы HTML могут дополнительно ограничивать размер загружаемого файла. Таким образом, при загрузке видео форма может ограничивать * максимальный размер до 10 МБ, а при загрузке фотографий форма может ограничивать всего 1 МБ. И в то же время, максимальный предел может быть установлен в php.ini, чтобы предположить, что все это разрешено 10 МБ.

Хотя это не надежный способ сообщить серверу, что делать, все же это может быть полезно.

  • HTML ничего не ограничивает. Он просто перенаправляет на сервер всю переменную формы, включая MAX_FILE_SIZE и ее значение.

Надеюсь, это кому-то помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...