Severin Kacianka: Frage zur maximalen größe von per POST hochgeladener Dateien

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

--
They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.
-- Benjamin Franklin
  1. 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

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

      --
      They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.
      -- Benjamin Franklin
  2. 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

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau

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

      --
      Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
      1. 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

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau

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

    --
    Wer schläft, sündigt nicht.
    Wer vorher sündigt, schläft besser.
    1. 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

      --
      They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.
      -- Benjamin Franklin