Wie kann ich feststellen, ob ein Benutzer eine Datei hochgeladen hat, die größer als post_max_size ist?

8

Wie soll ich mit HTTP-Uploads umgehen, die die post_max_size vernünftig überschreiten?

In meiner Konfiguration ist post_max_size ein paar MB größer als upload_max_filesize Die Probleme, die ich habe, sind:
Wenn ein Benutzer eine Datei hochlädt, die post_max_size

überschreitet
  • Das _POST-Array ist leer
  • Das Array _FILES ist leer, und natürlich sind darin keine Fehlercodes vorhanden.
  • Keine andere Information, welche Art von Form es ist, ist durch diese Mittel zugänglich.

Ein Teil des Problems besteht darin, dass das empfangende Skript abhängig vom Inhalt des POST verschiedene Aktionen ausführt.

Ich habe Zugriff auf die Variablen _SERVER und kann Hinweise dazu bekommen, was passiert ist, also CONTENT_TYPE , CONTENT_LENGTH und REQUEST_METHOD . Es erscheint jedoch sehr problematisch, auf diesen Inhalten basierende Vermutungen zu erstellen.

MEMORY_LIMIT (auf das 10-fache der relevanten Größen eingestellt) und Apaches LimitRequestBody (auf unbegrenzt gesetzt) ​​sind nicht fehlerhaft.

Wie es jetzt aussieht, fällt es mir schwer, dem Benutzer sogar aussagekräftige Nachrichten zu liefern.

Gibt es eine Möglichkeit, Formulardaten beizubehalten, um bessere Hinweise darauf zu erhalten, was falsch gelaufen ist? Ich bin sehr unwillig, von php wegzugehen.

    
Captain Giraffe 31.05.2011, 16:36
quelle

6 Antworten

8

Für eine einfache Korrektur, die keine serverseitigen Änderungen erfordert, würde ich die HTML5-Datei-API verwenden, um die Größe der Datei vor dem Hochladen zu überprüfen. Wenn es das bekannte Limit überschreitet, brechen Sie den Upload ab. Ich glaube, so etwas würde funktionieren:

%Vor%

Offensichtlich ist es nur ein Skelett eines Beispiels, und nicht jeder Browser unterstützt dies. Aber es würde nicht schaden, dies zu verwenden, da es so implementiert werden könnte, dass es für ältere Browser in Nichts zerfällt.

Natürlich löst das das Problem nicht, aber es wird zumindest einige Ihrer Benutzer mit minimalem Aufwand zufriedenstellen. (Und sie müssen nicht einmal warten, bis der Upload fehlschlägt.)

-

Nebenbei kann die Überprüfung von $_SERVER['CONTENT_LENGTH'] gegenüber der Größe der Post- und Dateidaten helfen, festzustellen, ob etwas fehlgeschlagen ist. Ich denke, wenn es einen Fehler gibt, wird es nicht Null sein, während die $_POST und $_FILES beide leer wären.

    
Matthew 31.05.2011, 17:15
quelle
3

In der PHP-Dokumentation :

  

Wenn die Größe der Postdaten größer als post_max_size ist, sind die Superglobals $ _POST und $ _FILES leer. Dies kann auf verschiedene Arten verfolgt werden, z. durch Übergeben der Variable $ _GET an das Skript, das die Daten verarbeitet, d. h. & lt; form action="edit.php? verarbeitete = 1" & gt; und dann überprüfen, ob $ _GET ['processed'] gesetzt ist.

Wenn Sie das Limit für ein bestimmtes Skript erhöhen möchten, können Sie ini_set (' post-max-size ', $ size_needed) ;. Ich bin mir nicht sicher, ob es in einem Skript überschrieben werden kann. diese Grenze ist wahrscheinlich da, um Sie daran zu hindern, das zu tun, was Sie vorhaben.

    
King Skippus 31.05.2011 16:47
quelle
1

Ich mochte die Antwort von @Matthew, aber ich brauchte eine Version, die nach mehreren Upload-Dateien sucht.

Das war meine Lösung:

%Vor%

Und zur Vollständigkeit, hier ist die Bindung der Funktion an das Formular gesendet:

%Vor%

HINWEIS:
uploadMax ist eine Variable, die ich nach Berechnung der maximalen Größe des erlaubten Uploads über PHP einstelle.

    
cale_b 15.08.2013 23:35
quelle
1

Sie können dies auf der Serverseite lösen, ohne auf eine Abfragezeichenfolge zurückgreifen zu müssen. Vergleichen Sie einfach die Einstellung * post_max_size * mit der erwarteten Inhaltslänge der Anfrage. Der folgende Code ist, wie Kohana es tut.

%Vor%     
Kevin Shallow 22.08.2013 14:51
quelle
0

Sie müssen möglicherweise zu etwas zurückkehren, das Flash / Silverlight usw. verwendet, wie zum Beispiel: Ссылка

Oder schauen Sie sich eine Java-basierte Lösung an ...

Grundsätzlich etwas, das den Upload in besser managbare (und fortsetzbare) Chunks unterbricht und sie dann auf der Serverseite wieder zusammenfügt.

    
Dan 31.05.2011 16:44
quelle
0

Sofern Ihr Upload-Formular keine anderen Felder als das Dateieingabefeld enthält, sollte $ _POST leer sein - Dateien werden ausschließlich über die $ _FILES verarbeitet. Es ist sehr seltsam, dass $ _FILES leer ist, wenn die Postgröße überschritten wird - die Upload-Handler haben einen spezifischen Fehlercode (1 / UPLOAD_ERR_INI_SIZE ) um eine solche Bedingung zu melden. Überprüfen Sie auch, ob memory_limit größer als upload_max_filesize ist.

Ihr Webserver blockiert möglicherweise auch den Upload, der vor dem Aufruf von PHP auftreten würde. Auf Apache wird es von LimitRequestBody gesteuert.

    
Marc B 31.05.2011 16:44
quelle

Tags und Links