Определение размера загружаемого файла на стороне клиента? - PullRequest
9 голосов
/ 29 мая 2010

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

Я только что попробовал пример в Firefox, Chrome и IE, и он не работает. Файл всегда загружается, даже если он намного больше указанного скрытого поля.

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

Ответы [ 4 ]

11 голосов
/ 29 мая 2010

Вкл. MAX_FILE_SIZE

Читать это:

... В http://pk.php.net/manual/en/features.file-upload.post-method.php и эквивалентных местах в других форматах указано что браузеры принимают значение поля формы MAX_FILE_SIZE в счет.

Эта информация повторяется в других местах в Интернете и в книгах, но кажется, происходит из документации PHP (он не появляется в условия других серверных технологий ).

В HTML, HTTP или связанных спецификациях нет ничего, что могло бы указывать что это так (в частности, RFC 1867, который представил файл при загрузке в HTML это не упоминается , так что это даже не случай что было упомянуто в первом RFC, а затем упал) смысл в контексте спецификаций HTML (нет ничего, чтобы указать связь между этим конкретным скрытым вводом и вводом файла). Единственные утверждения о скрытых полях, которые я мог найти в любом из них, были предупреждения в разделах, посвященных соображениям безопасности, от пользовательских агентов основывая любые связанные с файлами операции на чем-либо, упомянутом в скрытом поле.

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

Я утверждаю, что в основных браузерах такого механизма нет (если есть) вообще) и действительно не должно быть. Ссылка на него должна быть исключена из документация.

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

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


приведенный ниже код взят из реализации swfUpload php:

// Check post_max_size (http://us3.php.net/manual/en/features.file-upload.php#73762)
    $POST_MAX_SIZE = ini_get('post_max_size');
    $unit = strtoupper(substr($POST_MAX_SIZE, -1));
    $multiplier = ($unit == 'M' ? 1048576 : ($unit == 'K' ? 1024 : ($unit == 'G' ? 1073741824 : 1)));

    if ((int)$_SERVER['CONTENT_LENGTH'] > $multiplier*(int)$POST_MAX_SIZE && $POST_MAX_SIZE) {
        header("HTTP/1.1 500 Internal Server Error");
        echo "POST exceeded maximum allowed size.";
        exit(0);
    }
// Validate the file size (Warning the largest files supported by this code is 2GB)
    $max_file_size_in_bytes = 2147483647;           
    $file_size = @filesize($_FILES[$upload_name]["tmp_name"]);
        if (!$file_size || $file_size > $max_file_size_in_bytes) {
            HandleError("File exceeds the maximum allowed size");
            exit(0);
        }
6 голосов
/ 29 мая 2010

Возможно, сейчас это работает только в Firefox 3.6:

<script type="text/javascript">
    function checkSize()
    {
        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].fileSize > 1024) /* or maybe .size */
            {
                alert("The file must be less than 1KB");
                return false;
            }
        }

        return true;
    }
</script>


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

См. http://www.w3.org/TR/FileAPI/.

3 голосов
/ 29 мая 2010

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

Примеры сценариев: YUI2 Uploader , FancyUpload , SWFUpload

1 голос
/ 07 февраля 2014

Если вы правильно используете скрытое поле MAX_FILE_SIZE, загрузка файла просто прекратится, когда загруженный размер достигнет указанного значения. И, таким образом, избавляет пользователей от необходимости ждать передачи большого файла. Необходимо проверить, остановлена ​​ли загрузка файла на стороне сервера, с помощью сгенерированного кода ошибки .

if($_FILES['userfile']['error'] == 2) 
{
die("Maximum file size Exceeded");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...