Frank: upload_max_filesize stimmt nicht

Hallo zusammen,

ich habe ein Upload-Script zum Upload von Bildern geschrieben. Bei den meisten Bildern klappt auch alles wunderbar.

Manche Bilder werden aber nicht hochgeladen:
$_FILES['imagefile']['error']=int(2)

Das bedeutet (soweit ich das verstehe) das die Datei zu groß ist (siehe: http://de3.php.net/manual/de/features.file-upload.errors.php )

in der php.ini stehen folgende Werte:
post_max_size=8M
upload_max_filesize=2M

Die Datei selber ist aber nur 419kb groß.

Woran kann das liegen?

Viele Grüße
Frank

  1. Hi,

    Manche Bilder werden aber nicht hochgeladen:
    $_FILES['imagefile']['error']=int(2)

    Das ist ja nun nicht gerade eine Fehlermeldung.
    Das script, was du nutzt, kann man auch nur vermuten.

    Aber rate ich mal und dann würde ich sagen, du hast im Formular
    so was stehen :
    <input type="hidden" name="MAX_FILE_SIZE" value="3000">

    und wenn dem so ist solltest du dort die maximale Grösse
    auch anpassen. Wie gesagt nur vermutet aufgrund deiner spärlichen Daten.

    Gruss
    Denise

    1. Moin!

      Aber rate ich mal und dann würde ich sagen, du hast im Formular
      so was stehen :
      <input type="hidden" name="MAX_FILE_SIZE" value="3000">

      Welche Relevanz hat dieses Formularfeld denn für Dateiuploads?

      - Sven Rautenberg

      --
      "Love your nation - respect the others."
      1. echo $begrüßung;

        <input type="hidden" name="MAX_FILE_SIZE" value="3000">
        Welche Relevanz hat dieses Formularfeld denn für Dateiuploads?

        Ich nehme an, die im Handbuch beschriebene. Auch der Wert 2 in ['error'] hat laut Handbuch einen Bezug zu diesem ominösen Feld.

        echo "$verabschiedung $name";

        1. Moin!

          <input type="hidden" name="MAX_FILE_SIZE" value="3000">
          Welche Relevanz hat dieses Formularfeld denn für Dateiuploads?

          Ich nehme an, die im Handbuch beschriebene. Auch der Wert 2 in ['error'] hat laut Handbuch einen Bezug zu diesem ominösen Feld.

          Mir käme ehrlich gesagt nie in den Sinn, solch ein Feature zu nutzen.

          Entweder will ich nur relative kleine Dateien erlauben - dann muß ich das sowieso auf dem Server prüfen. Oder ich benötige das Upload-Maximum. Aber in keinem Fall will ich dem Benutzer gestatten, selbst das Maximum zu bestimmen.

          - Sven Rautenberg

          --
          "Love your nation - respect the others."
          1. Hello,

            Entweder will ich nur relative kleine Dateien erlauben - dann muß ich das sowieso auf dem Server prüfen. Oder ich benötige das Upload-Maximum. Aber in keinem Fall will ich dem Benutzer gestatten, selbst das Maximum zu bestimmen.

            Dieses Feature ist doch eigentlich als freundliche Bitte an den Browser gedacht, gar nicht erst Dateien zu senden, die größer sind, als MAX_FILE_SIZE.

            Wenn das nicht alle Browser beachten, kann der Server immer noch bremsen.

            Harzliche Grüße vom Berg
            http://www.annerschbarrich.de

            Tom

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

            1. Moin!

              Entweder will ich nur relative kleine Dateien erlauben - dann muß ich das sowieso auf dem Server prüfen. Oder ich benötige das Upload-Maximum. Aber in keinem Fall will ich dem Benutzer gestatten, selbst das Maximum zu bestimmen.

              Dieses Feature ist doch eigentlich als freundliche Bitte an den Browser gedacht, gar nicht erst Dateien zu senden, die größer sind, als MAX_FILE_SIZE.

              Wo steht das denn nun schon wieder? Im HTML-Standard sicher nicht!

              Wie in SELFHTML nachzulesen ist, gab es mal (!!!) ein Attribut für die Dateigröße:
              <input type="file" maxlength="BYTEZAHL">
              Dieses Attribut ist aber im aktuellen HTML-Standard für Dateifelder nicht mehr relevant, sondern wird in der DTD beschrieben als:
              maxlength   NUMBER         #IMPLIED  -- max chars for text fields --

              Nirgendwo ist außerdem eine Verbindung zwischen einem ziemlich beliebig benannten versteckten Formularfeld namens "MAX_FILE_SIZE" und einem Dateiuploadfeld geknüpft. Denn vollkommen ungeklärt bleibt ja, was gelten soll, wenn mehr als ein Dateiuploadfeld existiert, bzw. wie die Zuordnung gelten soll, wenn beide Feldtypen mehrfach vorkommen.

              Allein schon deshalb ist dieses "Feature", welches sich ausschließlich im Bereich von PHP abspielt, als sehr fragwürdig einzustufen.

              Fakt ist: Es gibt in derzeit existierenden Browsern keine Methode, dem Benutzer bei der Dateiauswahl eines normalen Uploadformularfeldes Größeneinschränkungen aufzuerlegen und einen u.U. sinnlosen Uploadvorgang zu verhindern.

              Wenn das nicht alle Browser beachten, kann der Server immer noch bremsen.

              Das ist ja eben der Punkt: Kein einziger Browser kümmert sich drum - kann sich nicht drum kümmern, weil das Hidden-Feld in keinerlei logischem Zusammenhang mit dem Uploadfeld steht.

              - Sven Rautenberg

              --
              "Love your nation - respect the others."
              1. Moin!

                Dieses Feature ist doch eigentlich als freundliche Bitte an den Browser gedacht, gar nicht erst Dateien zu senden, die größer sind, als MAX_FILE_SIZE.

                Wo steht das denn nun schon wieder? Im HTML-Standard sicher nicht!

                Ich hab das Thema noch etwas weiter recherchiert.

                Es gibt dazu einen PHP-Bug, der die Dokumentation berichtigen will: http://bugs.php.net/bug.php?id=40387

                Wie dort nachzulesen ist, hält der Bugmelder das Feature des "Browser lädt größere Dateien nicht hoch" für reine Phantasie der PHP-Programmierer. Die RFC 1867 bezieht sich ausschließlich auf das _Attribut_ "maxsize" innerhalb des File-Inputs, welches als Dateimaximum herangezogen werden _könnte_ (aber trotzdem von keinem Browser implementiert wird).

                Und entsprechend wurde die Dokumentation zumindest in der englischen Version "leicht angepaßt". Was dummerweise noch nicht ausreichend sein dürfte, denn der Bugmeldung ist zu entnehmen, dass diese Idee sich aus der PHP-Dokumentation heraus selbständig gemacht hat und jetzt als eine Art Hoax sein Unwesen treibt.

                Ich habe der Doku an den zwei relevanten Stellen mal einen Kommentar hinzugefügt, der sicher demnächst dort erscheinen wird.

                - Sven Rautenberg

                --
                "Love your nation - respect the others."
                1. Moin!

                  Ich hab das Thema noch etwas weiter recherchiert.

                  Je tiefer man gräbt, desto ... weia!

                  Anscheinend ist dieses doch eher als merkwürdig einzustufende Verhalten von PHP schon "seit immer" implementiert gewesen. Der Sourcecode im CVS zeigt jedenfalls schon seit Versionsnummer 1.3 der Datei main/rfc1867.c diese einfältige Abfrage nach dem speziellen Formularfeld "max_file_size" - was immerhin schon in einer der frühen PHP-3-Versionen war.

                  http://cvs.php.net/viewvc.cgi/php-src/main/rfc1867.c?revision=1.3&view=markup

                  Und auch die schriftliche Dokumentation zu diesem Feature spricht seit Anbeginn ihrer Existenz von diesem Feature.

                  http://cvs.php.net/viewvc.cgi/phpdoc/en/features/file-upload.xml?hideattic=0&revision=1.1.2.1&view=markup

                  Im Juli 2001 wird die Aussage über die angebliche Unterstützung durch nichtgenannte Browser hinzugefügt:
                  http://cvs.php.net/viewvc.cgi/phpdoc/en/features/file-upload.xml?hideattic=0&r1=1.18&r2=1.19

                  Im Jahre 2003 entsteht dann die Legende von der ominösen Warnmeldung vor dem Upload:
                  http://cvs.php.net/viewvc.cgi/phpdoc/en/features/file-upload.xml?hideattic=0&r1=1.55&r2=1.56

                  Im April 2004 wird der Absatz "ein wenig aufgeräumt" und "klarer formuliert":
                  http://cvs.php.net/viewvc.cgi/phpdoc/en/features/file-upload.xml?hideattic=0&r1=1.71&r2=1.73

                  Im Oktober 2004 wird der Text nochmals "klarer" formuliert - im Laufe der Zeit wurde aus dem anfangs harmlosen Textstückchen über einen kleinen, zusätzlichen und für manche auch unerwarteten Check harte Wahrheit über Browser und Dateiupload-Formulare:
                  http://cvs.php.net/viewvc.cgi/phpdoc/en/features/file-upload.xml?hideattic=0&r1=1.79&r2=1.80

                  Und erst im März 2007 wird die erste Korrektur zurück in die richtige Richtung unternommen:
                  http://cvs.php.net/viewvc.cgi/phpdoc/en/features/file-upload.xml?hideattic=0&r1=1.89&r2=1.90

                  Trotzdem ist in der Doku halt immer noch zu lesen:
                       "This form element should always be used as it
                        saves users the trouble of waiting for a big file being transferred only
                        to find that it was too big and the transfer failed."

                  Sehr spannend, wie sich Dinge so entwickeln.

                  - Sven Rautenberg

                  --
                  "Love your nation - respect the others."
                2. Hello,

                  Ich hab das Thema noch etwas weiter recherchiert.

                  Fein!

                  Da kann man mal sehen, was sich so alles festsetzt im Kopf.
                  Das habe ich dann bestimmt auch aus irgend einem meiner ersten PHP- oder HTML-Schwarten...
                  Da werde ich dann auch gleich mal den Rotstift zücken.

                  Harzliche Grüße vom Berg
                  http://www.annerschbarrich.de

                  Tom

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

    2. <input type="hidden" name="MAX_FILE_SIZE" value="3000">

      Hallo,

      manchmal ist man doch echt Betriebsblind und sieht den Wald vor lauter Bäumen nicht.

      Natürlich habe ich das im Formular stehen. Und natürlich war die Zahl dort zu klein eingestellt.

      Vielen Dank für Euren Denkanstoss. Jetzt funktionierts.

      Viele Grüße
      Frank

      1. <input type="hidden" name="MAX_FILE_SIZE" value="3000">
        Natürlich habe ich das im Formular stehen. Und natürlich war die Zahl dort zu klein eingestellt.

        Vielen Dank für Euren Denkanstoss. Jetzt funktionierts.

        Gern geschehen ;-)

        Hatte schon gar nicht mehr mit einer Rückmeldung gerechnet und
        war doch so neugierig, woran es denn nun lag.

        Denise

  2. Hello,

    in der php.ini stehen folgende Werte:
    post_max_size=8M
    upload_max_filesize=2M

    Die Datei selber ist aber nur 419kb groß.

    Woran kann das liegen?

    Daran, dass der Server eine eigene Beschränkung eingetragen hat. Die liegt bei typischen out-of-the-Box-Installationen bei 500kBytes. Da Dein File für den Upload in base64 codiert wird, ist er an der Transferschnittstelle (die das überwacht) ca. 1/4 größer, also 524 kBytes, was eindeutig mehr als 500kBytes sind.

    Schau in die Konfiguration des Webservers für PHP. Meistens steht es nicht direkt in der php.ini, sondern in einem ausgelagerten File.

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

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

    1. Hello,

      kleine Ergänzug noch

      Auszug aus meiner

      /etc/httpd/conf.d/php.conf

      PHP is an HTML-embedded scripting language which attempts to make it

      easy for developers to write dynamically generated webpages.

      LoadModule php4_module modules/libphp4.so

      Cause the PHP interpreter handle files with a .php extension.

      <Files ~ ".(php|php3|phtml)$">
          SetOutputFilter PHP
          SetInputFilter PHP
          LimitRequestBody 16000000
      </Files>

      Add index.php to the list of files that will be served as directory

      indexes.

      DirectoryIndex index.php index.php3

      Dieser Server nimmt nun 16.000.000 Bytes pro Upload an.
      In den Verzeichnis-Direktiven für den jeweiligen Virtual Host wird dann geregelt, wie weit PHP mitzieht. Nicht jede Domain kann also mit 16.000.000 Bytes beliefert werden.

      Harzliche Grüße vom Berg
      http://www.annerschbarrich.de

      Tom

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