Ankündigung

Einklappen
Keine Ankündigung bisher.

Upload großer Files clientseitig verhindern

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Upload großer Files clientseitig verhindern

    Hi,
    ich suche nach einer Möglichkeit den Upload sehr großer Dateien auf der Clientseite zu blocken. Ein
    HTML-Code:
    <input type="hidden" name="MAX_FILE_SIZE" value="512000" />
    kommt auf der Browserseite nicht zum tragen. Ist die Datei größer, wird diese dennoch zum Server transportiert und ich erhalte dann dort einen entsprechenden Fehler.
    Mein spezielles Problem ist, das dies ein HTTP Error 413 verursacht, wenn die Datei auch größer als post_max_size ist (Diese Werte kann und möchte ich nicht ändern).
    Ein Vorschlag dies mit Javascript abzufangen habe ich schon gefunden. Gibt es etwas besseres?

  • #2
    Was besseres, wie JS fällt mir da auch nicht ein.
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

    Kommentar


    • #3
      Das ist natürlich eine dumme Sache, dass es ohne Javascript und die schöne Api nicht geht, Ich würde daher das Formular nur mit Javascript anzeigen und wenn Javascript ausgeschaltet ist eben einen Hinweis darauf geben..
      Leider kann man auch auf dem Server erst die Grösse prüfen wenn der Upload abgeschlossen ist.

      Kommentar


      • #4
        Was spricht dagegen die maximale Größe einfach hinzuschreiben und wenn sich ein User nicht daran hält, ist das sein persönliches Pech, wenn er extra warten muss.

        Kommentar


        • #5
          Nun etwas warten wäre nicht das Problem. Ab einer bestimmten Dateigröße kommt es gar nicht zum Abschluss des Uploads, sondern der Nutzer sieht nur noch ein HTTP Error 413 im Browser.
          Hatte die Hoffnung das es im HTML so etwas wie eine Eigenschaft max_file_size gibt und ich das nur noch nicht geschnallt habe.
          Mache es jetzt mit Javascript, der files[0].size prüft und wenn zu groß den .value = "" setzt und einen entsprechenden Hinweis anzeigt. Muss ich aber noch mit div. Browsern testen.

          Kommentar


          • #6
            Zitat von jspit Beitrag anzeigen
            Nun etwas warten wäre nicht das Problem. Ab einer bestimmten Dateigröße kommt es gar nicht zum Abschluss des Uploads, sondern der Nutzer sieht nur noch ein HTTP Error 413 im Browser.
            Hatte die Hoffnung das es im HTML so etwas wie eine Eigenschaft max_file_size gibt und ich das nur noch nicht geschnallt habe.
            Mache es jetzt mit Javascript, der files[0].size prüft und wenn zu groß den .value = "" setzt und einen entsprechenden Hinweis anzeigt. Muss ich aber noch mit div. Browsern testen.
            JavaScript ist ja dazu da, um die User Experience zu verbessern. Sehe also kein Problem hier JavaScript zu verwenden. Und zusätzlich würde ich es noch hinschreiben. Falls wirklich mal der Fall eintritt, dass JavaScript deaktiviert ist und der User den Hinweis nicht liest, naja, jeden kann man auch nicht zu seinem Glück zwingen.

            Kommentar


            • #7
              Code 413 (entity too large) wird ja vom Server abgesendet, bei Apache kannst du in einer htaccess auch auf eine eigene Seite verweisen, wenn du das Benutzerfreundlicher gestalten willst, das kann du dann auch auf eine bestimmte URL festlegen bzw.. begrenzen.

              Kommentar


              • #8
                Die Dateien zum Hochladen erzeuge ich selbst. Stimmt, es schadet jedoch nicht, wenn es nochmal geschrieben steht was da hochgeladen werden soll.
                Wenn der Nutzer dann bei deaktivierten Javascript immer noch eine falsche Datei hochladen will und ihn fliegt es um die Ohren, dann muss er sich eben nochmal einloggen.

                Edit: Ist kein Apache, IIS oder vergleichbares.

                Kommentar


                • #9
                  Eine weitere Möglichkeit, wäre ein chunk upload. Habe damit selber mal in einem Projekt gearbeitet für Dateien >1GB und klappt echt super.
                  Ich weiß, du bist kein Fan von Libaries, aber vll. bringt dir das ja noch ein paar Ideen.
                  https://github.com/ankitpokhrel/tus-php

                  Kommentar


                  • #10
                    Zitat von Zeichen32 Beitrag anzeigen
                    Eine weitere Möglichkeit, wäre ein chunk upload. Habe damit selber mal in einem Projekt gearbeitet für Dateien >1GB und klappt echt super.
                    https://github.com/ankitpokhrel/tus-php
                    Das Thema hier war aber nur kleine Dateien (max. 200k) hochzuladen und große Dateien zu blocken, da ab einer gewissen Größe das System in die Knie geht.

                    Zitat von Zeichen32 Beitrag anzeigen
                    Ich weiß, du bist kein Fan von Libaries, aber vll. bringt dir das ja noch ein paar Ideen.
                    Hab nichts gegen Libaries, wer kann der soll. Bildlich gesprochen:
                    Ich würde es mir schon gerne bequem machen und einen einen 3 Meter breiten Dieselpanzer (SUV) mit allen Schnickschnack nutzen. Der Weg zu meiner Hütte ist aber nur 50 cm breit.

                    Konkret habe ich für den gesamten Programmcode meiner Applikation nur einige MByte zur Verfügung, wo auf "normalen" Hosting mittlerweile so 100 GByte Webspace Standard sind.
                    Die Nutzung einer solchen Library die dann noch mehr als 10 weitere große Libaries benötigen kommen für die Lösung so kleiner Detailprobleme für meine Applikationen gar nicht erst in Betracht.
                    Anschauen und ein paar Ideen mitnehmen kann jedoch nie schaden.

                    Kommentar


                    • #11
                      Was genau ist das Problem am Error 413?
                      Der besagt doch genau, was Sache ist: "Upload war zu groß".
                      Zeig doch dem User einfach eine entsprechende Fehlermeldung und gut ist?

                      Grüße.

                      Kommentar


                      • #12
                        Mir ist nicht klar wie ich da noch reagieren kann. Ich schildere mal genau den Ablauf. Womöglich mache ich einen Gedankenfehler.
                        1. Ein ganz normales Formular mit
                        HTML-Code:
                        <input type="hidden" name="MAX_FILE_SIZE" value="200000" />
                        <input type="file" id="projfile" name="projfile" size="30" accept=".zip"/>
                        Fall 1: zip-File ist kleiner
                        Die zip wird wie gewünscht von PHP verarbeitet

                        Fall 2: Die Datei ist etwas größer als 200000
                        Die Datei wird zu 100% hochgeladen. Ich bekomme im PHP im $_FILES['projfile']['error'] eine Fehlernummer (2) , das ich entsprechend behandle + eine Fehlermeldung ausgebe.

                        Fall 3: die Datei ist sehr viel größer (28 MB)
                        Der Upload startet, unten im Browser werden %Zahlen gezeigt, und noch bevor die 100% erreicht werden bekomme ich im Browser ein HTTP-Error: 413 gezeigt.
                        Zur Ausführung meines PHP-Skriptes kommt es nicht mehr.

                        Serverseitig kann ich da wohl nichts machen. Also verhindere ich auf der Clientseite das Absenden zu großer Dateien mit Javascript, da dies per HTML scheinbar nicht möglich ist.

                        Kommentar


                        • #13
                          Zur Ausführung meines PHP-Skriptes kommt es nicht mehr.
                          Muss ja auch nicht. Dass Du es Client seitig machen willst geht einen Schritt weiter in Richtung Usability.
                          Was die Kollegen aber meinten ist, dass Du die Fehlerseite für 413 im Webserver auf eine von Dir gestaltete Page umleitest. Dann hat zumindest der User schon mal keine hässliche Server-Meldung.

                          Und wie schon erwähnt: Wenn im Formular steht "bis max. 20MB", darf sich ein User auch nicht über die Wartezeit beschweren, wenn er dann versucht 28MB große Dateien hochzuladen und am Ende die Fehlerseite gezeigt wird.

                          Was Du versuchst, geht aus meiner Sicht schon in Richtung DAU-UsabilityOtimizing.
                          Competence-Center -> Enjoy the Informatrix
                          PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                          Kommentar


                          • #14
                            Zitat von Arne Drews Beitrag anzeigen
                            Was Du versuchst, geht aus meiner Sicht schon in Richtung DAU-UsabilityOtimizing.
                            Muss ich auch. Mehr möchte ich dazu nicht sagen...

                            Kommentar


                            • #15
                              Fall 2 und 3 kannst du zumindest vereinheitlichen indem du die Request-Limits im Webserver auf den gleichen Wert setzt.

                              Z.B:
                              Im Apache indem du limitRequestBody setzt.
                              Unter NGINX ist es client_max_body_size

                              Dann sollte es keinen Fall 2 mehr geben. Nur noch den 3.

                              Grüße.

                              Kommentar

                              Lädt...
                              X