Frage zur maximalen größe von per POST hochgeladener Dateien
Severin Kacianka
- php
-2 Anschinsan0 Tom2 Der Martin
Hallo,
Ich spiele mich gerade mit PHP-Dateiuploads und würde gerne wissen, wie groß die Dateien _netto_ sein dürfen die ich hochlade. Die upload_max_filesize steht dabei auf 2M (post_max_size,memory_limit auf 8M)
Wenn ich drei Datein hochlade zwei zu 900KB und eine zu 265 MB, klappt es.
Wenn ich drei Datein zu 809K, 981K, 973K hochlade klappt es auch.
Wenn ich eine Datei mit 1.7MB hochlade, klappt es nicht.
Warum? Welche Grenzen gibt es dann? Dürfen alle Dateigrößen zusammen die post_max_size nicht überschreiten? Aber warum kann ich dann eine 1.7MB Datei nicht hochladen?
Gruß und danke für eure Zeit,
Severin
Hallo Severin,
wir haben kürzlich festgestellt, dass das memory_limit ausgereizt wird, wenn man die Datei beim Upload bearbeitet.
ZB
Du kannst ein Bild mit 7,9 MB hochladen und wegspeichern, wenn das memory_limit auf 8 MB gesetzt ist.
Wenn du aber ein Bild mit 1,5 MB hochlädst und dann bearbeitest - also zB die Breite von 2000px auf 500px verkleinerst - wird dieses Bild im Arbeitsspeicher über 8MB groß. Dann klappts nicht.
Ich hoffe, ich konnte helfen
Anschinsan
Hallo Anschinsan,
Wenn du aber ein Bild mit 1,5 MB hochlädst und dann bearbeitest - also zB die Breite von 2000px auf 500px verkleinerst - wird dieses Bild im Arbeitsspeicher über 8MB groß. Dann klappts nicht.
Die Dateien werden nur "weggespeichert".
Gruß,
Severin
Hello,
wenn Du den Apache-Server verwendest, könnte es noch eine weitere Limitierung im Server geben. Das wäre jedenfalls normal.
LimitRequestBody 16000000
würde z.B. den gesamten Request auf 16.000.000 Bytes beschränken.
Da ist es dann auch egal, was PHP-intern noch anderes eingestellt wird.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hi,
LimitRequestBody 16000000
IMHO gibt es keine Möglichkeit, einen solchen Konfigurationswert mittels PHP auszulesen (um z.B. den Uploader auf die Begrenzung hinzuweisen). Oder irre ich mich?
Gruß, Cybaer
Hello,
LimitRequestBody 16000000
IMHO gibt es keine Möglichkeit, einen solchen Konfigurationswert mittels PHP auszulesen (um z.B. den Uploader auf die Begrenzung hinzuweisen). Oder irre ich mich?
Ist mir auch nicht bekannt.
Darum sollte der PHP-interne Wert eigentlich auch immer darunter liegen.
Das ist aber Sache einer guten Systemkonfiguration.
Bei einem unserer Systeme habe ich mich auch mal blutig gesucht. Das lag dann daran, dass einige für die Daemons und Parser zuständigen Einstellungen ausgelagert waren und nicht direkt in der httpd.conf standen.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
n'Abend!
Ich spiele mich gerade mit PHP-Dateiuploads und würde gerne wissen, wie groß die Dateien _netto_ sein dürfen die ich hochlade.
Beim Datei-Upload mit einem HTML-Formular musst du ja wohl enctype="multipart/form-data" verwenden. Dann werden die hochgeladenen Dateien, eine nach der anderen, im Request-Body mit übertragen.
Das bedeutet aber, dass diese Dateien dann nicht "binary" übertragen werden, sondern MIME-codiert. Die HTML-Spec verweist dabei auf RFC2045, die für die Codierung entweder Quoted Printable oder base64 anbietet. Quoted Printable ist nur bei "lesbaren", also textbasierten Formaten sinnvoll, bei Binärdateien kommt wohl base64 zum Einsatz. Und diese Codierung bringt es nun mal mit sich, dass das übertragene Datenvolumen um ein Drittel im Verhältnis zu den Rohdaten anwächst. Wenn upload_max_filesize also auf 2MB gesetzt ist, kannst du maximal 1.5MB Rohdaten hochladen (minus ein paar hundert Bytes für den Request-Header und die MIME-Rahmeninformationen).
Wenn ich drei Datein hochlade zwei zu 900KB und eine zu 265 MB, klappt es.
Wenn ich drei Datein zu 809K, 981K, 973K hochlade klappt es auch.
Wenn ich eine Datei mit 1.7MB hochlade, klappt es nicht.
Oh, das lässt mich vermuten, dass upload_max_filesize in PHP für jede Datei einzeln abgeprüft wird und nicht für die Summe der Dateigrößen. Außerdem gehe ich davon aus, dass es in deinem ersten Beispiel wohl 265kB heißen sollte und noch 265MB.
Warum?
Siehe oben - die base64-Codierung bringt's.
Schönen Abend noch,
Martin
Hallo Martin,
Und diese Codierung (base64 Anm. d. A.) bringt es nun mal mit sich, dass das übertragene Datenvolumen um ein Drittel im Verhältnis zu den Rohdaten anwächst.
Danke für diese Antwort! Jetzt verstehe ich endlich warum ich die Grenze von 2MB nie erreiche.
Gruß,
Severin