Обнаружение файла загружает размер на стороне клиента?

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

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

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

9
задан DisgruntledGoat 29 May 2010 в 11:22
поделиться

3 ответа

На 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);
        }
11
ответ дан 4 December 2019 в 10:03
поделиться

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

Примеры скриптов: YUI2 Uploader, FancyUpload, SWFUpload

3
ответ дан 4 December 2019 в 10:03
поделиться

Возможно, пока это работает только в 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/.

6
ответ дан 4 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: