2010-05-29 7 views
8

Ich benutze PHP für Datei-Uploads. In der PHP manual zeigt es ein Beispiel mit einem versteckten Feld MAX_FILE_SIZE, dass auf der Client-Seite (d. H. Der Browser) erkennt, ob die Datei zu groß ist oder nicht.Datei-Upload-Größe auf der Client-Seite erkennen?

Ich habe gerade das Beispiel in Firefox, Chrome und IE versucht und es funktioniert nicht. Die Datei wird immer hochgeladen, auch wenn sie viel größer ist als das angegebene versteckte Feld.

Übrigens, wenn die Datei größer als MAX_FILE_SIZE ist, funktioniert der Aufruf von move_uploaded_file nicht, so scheint es, dass die Variable einen Server-Effekt hat, aber nicht clientseitig.

Antwort

10

Auf MAX_FILE_SIZE

diese lesen:

... An http://pk.php.net/manual/en/features.file-upload.post-method.php und gleichwertigen Stellen in anderen Formaten, werden erklärt, dass Browser den Wert eines MAX_FILE_SIZE Formularfeldes nimmt in Konto.

Diese Informationen auf dem Netz an anderer Stelle wiederholt wird und in Büchern, aber erscheint aus der PHP-Dokumentation stammen (es erscheint nicht in Bezug auf anderen serverseitige Technologien).

Es gibt nichts, an der ein HTML, HTTP oder ähnlichen Spezifikationen um anzuzeigen, dass dies der Fall ist (insbesondere RFC 1867, die Datei eingeführt ist Uploads zu HTML nicht nicht erwähnt, so ist es nicht selbst ein Fall eines Kludges , der im ersten RFC erwähnt und dann fallengelassen wurde) macht es auch nicht Sinn im Zusammenhang mit den HTML-Spezifikationen (es gibt keine Beziehung zwischen diesem bestimmten versteckten Eingang und der Dateieingabe) . Die einzigen Aussagen über versteckte Felder, die ich in einer von ihnen war Warnungen in den Sicherheitsüberlegungen Abschnitte gegen User-Agents basieren alle dateibezogenen Vorgänge auf etwas erwähnt in einem versteckten Feld gefunden.

Keine Browser scheint dies als eine "Erweiterung" durchzuführen. In der Tat, gibt es möglicherweise andere mögliche Bedeutungen für ein verstecktes Feld mit dieser Name in einer Anwendung, die mehrere Datei-Uploads behandelt, würde es haben, um eine Design-Schwachstelle zu sein, die jeder tat.

Ich unterbreite, dass es keinen solchen Mechanismus in Mainstream-Browsern gibt (falls überhaupt ) und in der Tat nicht sein sollte. Der Verweis darauf sollte von Dokumentation fallengelassen werden.

Ich würde weiter empfehlen, dass, da diese Idee von dieser Dokumentation an anderer Stelle propagiert wurde, dass ein Hinweis darüber nicht funktioniert sollte hinzugefügt werden.

Wenn ein Mechanismus erforderlich ist oder schneller Umgang mit dieser Art von Datei gewünscht Umgang mit Problem dann erfordert es Funktionalität PHP zu ermöglichen Ströme abzufangen, bevor Anfrage Fertigstellung hochgeladen werden, die völlig anders sein würde, wie diese Dokumentation vorschlägt es behandelt werden sollten, selbst wenn es wahr ...

war

der Code unten kam aus SWFUpload php Umsetzung:

// 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; gute Untersuchung. – strager

+0

'Sie müssen überprüfen, die hochgeladene Datei war weniger als MAX_FILE_SIZE mit PHP' Nein, Sie nicht. Einfach dieses nutzlose Feld loswerden –

+0

"erfordert Funktionalität, damit PHP Streams abfangen kann, die vor der Vervollständigung der Anfrage hochgeladen werden" -> PHP kann die Anfrage abfangen, wenn ihre Länge das in 'post_max_size' angegebene Limit überschreitet 'Content-Length', und von modernen Browsern scheint nur Opera diesen Header zu senden. –

3

Soweit ich weiß, gibt es keine einfache, Cross-Browser-Lösung, dies zu erreichen. Die einzigen funktionierenden Lösungen sind Flash oder Java, da diese Technologien auf das Dateisystem zugreifen und Dateiinformationen abrufen können.

Beispielskripte: YUI2 Uploader, FancyUpload, SWFUpload

+0

Außerdem gibt es Uploadify (http://www.uploadify.com/) für den Upload von HTML5-Dateien –

6

Dies ist wahrscheinlich nur auf Firefox 3.6 für jetzt funktioniert:

<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> 

Siehe http://www.w3.org/TR/FileAPI/.

1

Wenn Sie das versteckte Feld MAX_FILE_SIZE ordnungsgemäß verwenden, wird das Hochladen der Datei nur gestoppt, wenn die hochgeladene Größe den angegebenen Wert erreicht. Und damit erspart sich der Benutzer das Warten auf die Übertragung einer großen Datei. Sie müssen überprüfen, ob der Dateiupload auf der Serverseite gestoppt wurde, indem Sie error code generiert.

Verwandte Themen