Sonic: Upload-Skript streikt bei größeren Dateien

Hi!

Ich habe auf Basis des SelfHTML-Artikels ein Upload-Formular mit Perl für unseren Server geschrieben, das für kleinere Dateien (so bis 1MB) echt gut funktioniert. Das Dumme ist nur, daß das dafür gedacht ist, mit freien Mitarbeitern Entwürfe für Musiken und kurze Filmclips auszutauschen, weshalb die Dateien so zwischen 3 und 10 MB haben.
Wenn ich so eine Datei rauflade, bekomme ich immer nur Internal Server Errors (obwohl ich bei jedem Schritt des Skripts "or die $!" angefügt habe). Die maxlength im HTML-Formular habe ich auf 80000000 gesetzt, das sollte also auch kein Problem sein. Wenn jemand einen Tip hätte, wäre ich echt dankbar!

Ciao,

Sonic

  1. Hi!

    Ich habe auf Basis des SelfHTML-Artikels ein Upload-Formular mit Perl für unseren Server geschrieben, das für kleinere Dateien (so bis 1MB) echt gut funktioniert. Das Dumme ist nur, daß das dafür gedacht ist, mit freien Mitarbeitern Entwürfe für Musiken und kurze Filmclips auszutauschen, weshalb die Dateien so zwischen 3 und 10 MB haben.
    Wenn ich so eine Datei rauflade, bekomme ich immer nur Internal Server Errors (obwohl ich bei jedem Schritt des Skripts "or die $!" angefügt habe). Die maxlength im HTML-Formular habe ich auf 80000000 gesetzt, das sollte also auch kein Problem sein. Wenn jemand einen Tip hätte, wäre ich echt dankbar!

    Ciao,

    Sonic

    Wie lädst Du die Dateien hoch ? Was für eine Methode nutzt Du im Formular ? etwa GET ? oder POST ? Ich würd Dir empfehlen das zweite zu nutzen, da das erste beschränkt ist von der Größe, da alles per URL übergeben wird.

    mehr kann cih leidernicht sagen, da ich weder das Script kenne, noch das Formular

    1. Wie lädst Du die Dateien hoch ? Was für eine Methode nutzt Du im Formular ? etwa GET ? oder POST ? Ich würd Dir empfehlen das zweite zu nutzen, da das erste beschränkt ist von der Größe, da alles per URL übergeben wird.

      POST

      mehr kann cih leidernicht sagen, da ich weder das Script kenne, noch das Formular

      Auszug:
      open (DAT, ">$fname") || die 'Fehler beim Öffnen der Datei: ',$!;

      binmode $file;
      binmode DAT;

      while(read $file,$data,1024) {
        print DAT $data || die 'Fehler beim Schreiben: ',$!;;
      }
      close DAT || die 'Fehler beim Schließen: ',$!;

      1. Wie lädst Du die Dateien hoch ? Was für eine Methode nutzt Du im Formular ? etwa GET ? oder POST ? Ich würd Dir empfehlen das zweite zu nutzen, da das erste beschränkt ist von der Größe, da alles per URL übergeben wird.

        POST

        mehr kann cih leidernicht sagen, da ich weder das Script kenne, noch das Formular

        Auszug:
        open (DAT, ">$fname") || die 'Fehler beim Öffnen der Datei: ',$!;

        binmode $file;
        binmode DAT;

        while(read $file,$data,1024) {
          print DAT $data || die 'Fehler beim Schreiben: ',$!;;
        }
        close DAT || die 'Fehler beim Schließen: ',$!;

        was macht das 1024 da ? klingt nach 1MB
        steig leider durch den code nich so ganz durch aber ich würd intuitiv aus dem 1024 mal ein 2048 machen und probeiren ob dann 2MB gespeichert werden ;-)

        1. Auszug:
          open (DAT, ">$fname") || die 'Fehler beim Öffnen der Datei: ',$!;

          binmode $file;
          binmode DAT;

          while(read $file,$data,1024) {
            print DAT $data || die 'Fehler beim Schreiben: ',$!;;
          }
          close DAT || die 'Fehler beim Schließen: ',$!;

          was macht das 1024 da ? klingt nach 1MB
          steig leider durch den code nich so ganz durch aber ich würd intuitiv aus dem 1024 mal ein 2048 machen und probeiren ob dann 2MB gespeichert werden ;-)

          Aus dem SelfHTML Feature-Artikel:

          "In der oberen While-Schleife wird die Datei in 1024k-Blöcken eingelesen und in die andere Datei geschrieben. Beide sind im Binär-Modus geöffnet, weil nicht bekannt ist, ob die Daten, die ankommen, Binär- oder Text-Daten sind."

          Ich weiß leider nicht, ob das 1024 Kbit oder Kbyte sind, aber eigentlich sollte es keinen Unterschied machen, weil die Schleife ja durchlaufen sollte, bis die Datei eingelesen ist. aber ich werd das mal ausprobieren...

  2. Hi!

    Tach,

    Wenn ich so eine Datei rauflade, bekomme ich immer nur Internal Server Errors (obwohl ich bei jedem Schritt des Skripts "or die $!" angefügt habe).

    Obwohl? Weil!
    Ist doch logisch, daß der Browser nur den Server Error zu sehen bekommt, wenn Du im Fehlerfall das Script abwürgst.

    Schon mal im error.log geguckt, welcher Fehler denn aufgetreten ist?

    Die maxlength im HTML-Formular habe ich auf 80000000 gesetzt, das sollte also auch kein Problem sein.

    Was hat maxlength damit zu tun?

    Auszug aus dem HTML 4.01-Standard (http://www.w3.org/TR/html4/interact/forms.html#adef-maxlength):
    maxlength = number [CN]
    When the type attribute has the value "text" or "password", this attribute specifies the maximum number of characters the user may enter. This number may exceed the specified size, in which case the user agent should offer a scrolling mechanism. The default value for this attribute is an unlimited number.

    Da steht nichts davon, daß dieses Attribut irgendeine Bedeutung haben könnte, wenn das type-Attribut den Wert "file" hat.

    Vielleicht ist ja am Server irgendwo eine Maximalgröße für den Request konfiguriert.

    Andreas

    1. Hi!

      Tach,

      Wenn ich so eine Datei rauflade, bekomme ich immer nur Internal Server Errors (obwohl ich bei jedem Schritt des Skripts "or die $!" angefügt habe).

      Obwohl? Weil!
      Ist doch logisch, daß der Browser nur den Server Error zu sehen bekommt, wenn Du im Fehlerfall das Script abwürgst.

      Nicht wirklich. $! gibt mir normalerweise eine detailliertere Fehlermeldung zurück. Zudem habe ich noch ein, zwei Wort Davor geschrieben, damit ich weiß, wo der Fehler auftritt (die "Fehler Zeile 6: $!"), aber er bringt mir keine solche Meldung...

      Schon mal im error.log geguckt, welcher Fehler denn aufgetreten ist?

      Ist in Arbeit, poste ich, sobald ich das Log (bei Strato) gefunden habe

      Die maxlength im HTML-Formular habe ich auf 80000000 gesetzt, das sollte also auch kein Problem sein.

      Was hat maxlength damit zu tun?

      Weiß ich auch nicht wirklich, es stand nur im Feature-Artikel, das man das angeben soll...

      Auszug aus dem HTML 4.01-Standard (http://www.w3.org/TR/html4/interact/forms.html#adef-maxlength):
      maxlength = number [CN]
      When the type attribute has the value "text" or "password", this attribute specifies the maximum number of characters the user may enter. This number may exceed the specified size, in which case the user agent should offer a scrolling mechanism. The default value for this attribute is an unlimited number.

      Da steht nichts davon, daß dieses Attribut irgendeine Bedeutung haben könnte, wenn das type-Attribut den Wert "file" hat.

      Vielleicht ist ja am Server irgendwo eine Maximalgröße für den Request konfiguriert.

      Andreas

      1. Hi!

        Tach,

        Wenn ich so eine Datei rauflade, bekomme ich immer nur Internal Server Errors (obwohl ich bei jedem Schritt des Skripts "or die $!" angefügt habe).

        Obwohl? Weil!
        Ist doch logisch, daß der Browser nur den Server Error zu sehen bekommt, wenn Du im Fehlerfall das Script abwürgst.

        Nicht wirklich. $! gibt mir normalerweise eine detailliertere Fehlermeldung zurück. Zudem habe ich noch ein, zwei Wort Davor geschrieben, damit ich weiß, wo der Fehler auftritt (die "Fehler Zeile 6: $!"), aber er bringt mir keine solche Meldung...

        Ja, $! enthält die Fehlermeldung. "die" schreibt aber auf STDERR (also ins error.log), nicht auf STDOUT (was beim Browser landen würde). Nach Ausgabe der Meldung wird das Script dann beendet.

        Andreas

        1. Ja, $! enthält die Fehlermeldung. "die" schreibt aber auf STDERR (also ins error.log), nicht auf STDOUT (was beim Browser landen würde). Nach Ausgabe der Meldung wird das Script dann beendet.

          Andreas

          Ich habe gerade nochmal nachgelesen: Die Fehlerausgabe ist mittels "use CGI::Carp qw(fatalsToBrowser);" an den Browser umgelenkt (hatte ich vom Beispielskript mitkopiert), das kann also nicht das Problem sein

      2. Hi Andreas,

        Wenn ich so eine Datei rauflade, bekomme ich immer nur
        Internal Server Errors (obwohl ich bei jedem Schritt
        des Skripts "or die $!" angefügt habe).
        Obwohl? Weil!
        Ist doch logisch, daß der Browser nur den Server Error zu sehen
        bekommt, wenn Du im Fehlerfall das Script abwürgst.
        Nicht wirklich. $! gibt mir normalerweise eine detailliertere
        Fehlermeldung zurück. Zudem habe ich noch ein, zwei Wort Davor
        geschrieben, damit ich weiß, wo der Fehler auftritt (die "Fehler
        Zeile 6: $!"), aber er bringt mir keine solche Meldung...

        und was von all dem soll Deiner Meinung nach der korrekte HTTP-Header
        sein, den Dein Upload-Skript in jedem Fall zuerst ausgeben muß?

        Viele Grüße
              Michael

  3. Hi Sonic,

    Die maxlength im HTML-Formular habe ich auf 80000000 gesetzt,
    das sollte also auch kein Problem sein.

    kennst Du irgend einen Browser, der diese Angabe auswertet?

    Viele Grüße
          Michael