2010-05-29 2 views
8

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

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

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

ответ

10

На 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 перехватывать потоки загружается до завершения запроса, который бы совершенно иначе, как эта документацию предложить это следует рассматривать, даже если бы это было правдой ...


ниже код приходит от реализации PHP SWFUpload:

// 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); 
     } 
+0

+1; хорошее исследование. – strager

+0

'вам нужно проверить, что загруженный файл был меньше MAX_FILE_SIZE, используя PHP' no, вы этого не делаете. Просто избавиться от этого бесполезного поля –

+0

«требует функциональности, позволяющей PHP перехватывать потоки, загружаемые до завершения запроса» -> PHP может перехватить запрос, если его длина превышает предел, указанный в 'post_max_size', но для этого требуется, чтобы браузер отправил заголовок запроса, содержащий 'Content-Length', а из современных браузеров Opera просто посылает этот заголовок. –

3

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

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

+0

Также есть Uploadify (http://www.uploadify.com/) для загрузки файлов HTML5 –

6

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

1

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

if($_FILES['userfile']['error'] == 2) 
{ 
die("Maximum file size Exceeded"); 
} 
Смежные вопросы