Marcel: Premature end of script headers

Hallo!!
Ich hab da ein Problem mit einem cgi upload-script!
MANCHMAL bekomme ich die Fehlermeldung Premature end of script headers zurück. Beim zweiten starten des scripts wirds dann ausgeführt.
#!perl -w

use strict;
use CGI; # Modul fuer CGI-Programme

my $cgi = new CGI; # neues Objekt erstellen

print "Content-type: text/html\n\n";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">', "\n";
print "<html><head><title>Upload Feedback</title></head><body>\n";

die Formular-daten holen

my $file = $cgi->param("myfile");
my $wasfach = $cgi->param("fach");
my $kommentar = $cgi->param("beschreibung");
my @Datei = split(/\/ ,$file); #letztes Element des Arrays ist Dateiname
my $Dateiname = $Datei[$#Datei]; #ermittelt letztes element

#größe der Datei ermitteln
my $Dateisize = -s $file;
$Dateisize /= 1000; #Datei jetzt in kByte
if ($Dateisize > 2000) #wenn Datei größer 2MByte
{
print "<p>Datei ist zu groß, höchstens 2 MByte</p>\n";
print "</body></html>\n";
die;                   # ABBRECHEN!!!
}

dateinamen erstellen und die datei auf dem server speichern

chdir("../$wasfach");
my $fname = $Dateiname;
open DAT,'>'.$fname or die 'Error processing file: ',$!;

Dateien in den Binaer-Modus schalten

binmode $file;

my $data;
while(read $file,$data,1024) {
  print DAT $data;
}
close DAT;
print "<p>Datei $file wurde erfolgreich übertragen</p>\n";
print "</body></html>\n";

Wenn ich das script Lokal auf meinem Rechner starte funktioniert es immer!
Wenn jemand eine Idee hat, wäre ich ziemlich froh :-))
Ok, MfG
Marcel

  1. hi,

    es "klemmt" bereits hier:

    #!perl -w

    Aber da müßte dir eigentlich eine andere Fehlermeldung geliefert werden  -  es sei denn, du läßt das Script über einen Apache auf WINDOWS (und mit der entsprechenden Eintragung in der httpd.conf) oder über den IIS laufen.

    Was steht denn in den logs noch so drin?

    Christoph S.

    1. Hoi,

      es "klemmt" bereits hier:

      #!perl -w

      Iwo. Wenn die Perl-Binary im Path liegt (und das ist /usr/bin bei den
      meisten Usern), dann geht das auch so.

      Gruesse,
       CK

    2. Hallo!
      Danke schonmal für die Zahlreichen Antworten!
      Leider habe ich keinen zugriff auf die error.log´s bei meinem Anbieter (kontent) und da das script bei mir zu Hause lokal funktioniert kann ich nicht sagen, was da so steht :-)
      Habt ihr vielleicht ne Ahnung wie ich dann genauere Infos über den Fehler bekommen kann ?
      MfG
      Marcel Sicking

  2. Hi,

    MANCHMAL bekomme ich die Fehlermeldung Premature
    end of script headers zurück. Beim zweiten starten
    des scripts wirds dann ausgeführt.

    Anscheinend gibt irgendwas innerhalb Deines Skripts manchmal eine Fehlermeldung nach stdout aus - und zwar
    _bevor_ Du Deinen HTTP-Header ausgegeben hast.
    Das Ergebnis ist dann ein HTTP-Header mit kaputtem Inhalt, welcher diese Meldung im Server verursacht.

    Die Fehlermeldung Deines Skripts kannst Du in Deinem
    error_log nachlesen. (Du hast doch ein error_log? Du
    wirst doch nicht etwa im Blindflug CGI-Skripte entwickeln? ;-)

    print "Content-type: text/html\n\n";

    Vor dieser Meldung kann eigentlich nicht viel schief
    gehen - "use CGI" sollte ja wohl funktionieren.

    Aber alles Raten nützt wenig - schau in Dein Log.
    Dazu ist es da.

    Viele Grüße
          Michael

    1. Halihallo

      MANCHMAL bekomme ich die Fehlermeldung Premature
      end of script headers zurück. Beim zweiten starten
      des scripts wirds dann ausgeführt.

      Anscheinend gibt irgendwas innerhalb Deines Skripts manchmal eine Fehlermeldung nach stdout aus - und zwar
      _bevor_ Du Deinen HTTP-Header ausgegeben hast.
      Das Ergebnis ist dann ein HTTP-Header mit kaputtem Inhalt, welcher diese Meldung im Server verursacht.

      Die Fehlermeldung Deines Skripts kannst Du in Deinem
      error_log nachlesen. (Du hast doch ein error_log? Du
      wirst doch nicht etwa im Blindflug CGI-Skripte entwickeln? ;-)

      Ich bin mal so "frech" und sage, dass es sich sogar _nur_ um diesen Fehler handeln kann. Veraten tut mir das MANCHMAL aus dem Ausgangsposting.
      Einfach mal

      autoflush(STDOUT); autoflush(STDERR);

      an den Anfang des Scriptes hängen und schon wird man schlauer...
      Der Fehler ist damit zwar nicht behoben, aber die Page sollte wenigstens Dargestellt werden.

      Ich nehme an, dass dir -w irgendwelche Fehler gibt. Folgendes hab ich beim überfliegen des Sources festgestellt:

      my $Dateiname = $Datei[$#Datei]; #ermittelt letztes element

      das letzte Element hat den Index (scalar(@Datei)-1), nicht $#Datei.

      $Dateisize /= 1000; #Datei jetzt in kByte
      if ($Dateisize > 2000) #wenn Datei größer 2MByte

      btw: Ein Megabyte hat 1024 KByte und ein KByte hat 1024 Bytes...

      Viele Grüsse

      Philipp

      1. Hallo Philipp,

        Ich nehme an, dass dir -w irgendwelche Fehler gibt. Folgendes hab
        ich beim überfliegen des Sources festgestellt:

        my $Dateiname = $Datei[$#Datei]; #ermittelt letztes element

        das letzte Element hat den Index (scalar(@Datei)-1), nicht $#Datei.

        Du haettest 'perldoc perldata' aufmerksamer lesen sollen. $#array
        bezeichnet den Index des letzten Elements und ist -1, wenn der Array
        leer ist.

        Gruesse,
         CK

        1. Halihallo Christian

          das letzte Element hat den Index (scalar(@Datei)-1), nicht $#Datei.

          Du haettest 'perldoc perldata' aufmerksamer lesen sollen. $#array
          bezeichnet den Index des letzten Elements und ist -1, wenn der Array
          leer ist.

          Ay caramba. Hast recht. Ich entschuldige mich für die Fehlinformation.

          Viele Grüsse und Danke

          Philipp