Определение размера загрузки файлов на стороне клиента?

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

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

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

В MAX_FILE_SIZE

Прочитай это:

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

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

Ничто в любом из HTML, HTTP или связанных спецификаций не указывает на то, что это так (в частности RFC 1867, в котором введены файлы для загрузки в HTML, не упоминается об этом , так что это даже не случай kludge, который был упомянутый в первом 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); } 

Вероятно, это работает только сейчас на 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/ .

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

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

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

 if($_FILES['userfile']['error'] == 2) { die("Maximum file size Exceeded"); }