Störende header Ausgabe

dark_ghost

Erfahrenes Mitglied
Hallo zusammen,

Mit folgendem Code wird ein Verzeichnis zeilenweise eingelesen und jede der Suchanfrage entsprechende Datei ausgegeben.

Code:
print $cgi->header(),
                $cgi->start_html('|-Verarbeitung-|'),
                $cgi->a({-href =>"http://lnxmt01:12345/archiv/$new_file", type =>'application/adobereader'}, "$file<br>"),
                $cgi->end_html();

Das funktioniert auch wunderbar aber es wird bei jeder weiteren Ausgabe immer der header mit ausgegeben, kann ich das unterdrücken
Hier ein Ausgabebeispiel:

_416520_20051220_RG_.pdf
Content-Type: text/html; charset=ISO-8859-1 _416520_20051222_RG_.pdf
Content-Type: text/html; charset=ISO-8859-1 _416520_20051228_RG_.pdf
Content-Type: text/html; charset=ISO-8859-1

Bei der ersten Ausgabe ist noch alles ok aber ab der zweiten aufwärts wird zusätzlich der header mit ausgegeben.


Über Tipps und Anregungen freu ich mich
Danke

Andreas
 
Zuletzt bearbeitet:
Ich glaube nicht, dass du mit dem Beispielcode tatsächlich all das machst, was du sagst. ;)

Vermutlich sieht das irgendwie so aus:
Perl:
opendir(DIR, ".") or die "Can't opendir: $!";
my @files = grep { / ^[^\.]/ } readdir(DIR);
closedir(DIR);

foreach(@files) {
   print $cgi->header(),
                $cgi->start_html('|-Verarbeitung-|'),
                $cgi->a({-href =>"http://lnxmt01:12345/archiv/$new_file", type =>'application/adobereader'}, "$file<br>"),
                $cgi->end_html();
}

Und da ist natürlich logisch, das bei jedem Schleifendruchlauf auch ein neuer Header mit ausgegeben wird. Richtig müsste das in etwas so aussehen:

Perl:
# verzeichnis öffnen und dateien wieder in array legen
print $cgi->header, $cgi->start_html('title');
foreach(@files) {
   print $cgi->a({-href =>"http://lnxmt01:12345/archiv/$new_file", type =>'application/adobereader'}, "$file<br>"),
}
print $cgi->end_html;

Schlieslich möchtest du nur einmal den Header sowie den Anfang und das Ende vom HTML übersenden aber beliebig oft dazwischen Links zu den gefundenen Dateien ausgeben.
 
Hallo,

vielen Dank das ist (fast) die Lösung meines Problemes.
Der header wird nicht mit jedem Schleifendurchgang ausgegeben.

Allerdings wird er am Ende der Schleife einmal ausgegeben,

_416520_20051220_RG_.pdf
_416520_20051222_RG_.pdf
_416520_20051228_RG_.pdf
Content-Type: text/html; charset=ISO-8859-1

An was kann das liegen, ich habe folgendes notiert.
Vor der Foreachschleife:

print $cgi->header(),
$cgi->start_html('|-Verarbeitung-|');

Nach der Foreachschleife:

print $cgi->end_html();


Wäre super wenn du/ihr darauf auch eine Antwort hast/hättet :)
Danke schon mal
 
Naja, er wird natürlich nur ausgegeben, wenn du ihn auch irgendwo ausgeben lässt. Folglich muss irgendwo nach der Schleife nochmal ein Header geschickt werden.

Evtl. in einer IF-Abfrage die nicht richtig konstruiert wurde und ausgeführt wird, wenn sie das eigentlich nicht sollte?

Genauso könnte es natürlich auch sein das eine von dir hinterher aufgerufene Funktion einen header schickt weil sie mal von einer Funktion aufgerufen wird die selbst keinen Header schickt und im jetztigen Fall von einer Funktion aufgerufen wird die bereits einen Header geschickt hat.

Da bliebe dann entweder nur die etwas unschöne Lösung das man z.B. einen Parameter mitgibt mit dessen hilfe man entscheiden kann, ob ein Header geschickt werden soll oder nicht oder eben eine gesonderte Funktion die für dich das Header-Management übernimmt. Diese würde dann, sobald ein Header das erste mal geschickt wurde eine Variable auf einen wahren Wert setzen und bei einem erneuten Aufruf der Funktion nicht nochmals den Header schicken.

Sofern dir das möglich ist, kannste evtl. einfach mal das komplette Script anhängen/posten?
 
Hi,

ein header sollte nur am anfang der foreach-schleife ausgegeben werden, woanders ist keiner notiert. Außer in der Fehlerabfrage beim öffnen des Verzeichnisses, jedoch wird dieser header doch nur gesendet wenn in den Fehlerzweig beim öffnen gesprungen wird, sollte also keine Probleme bereiten ...

Hier dennoch der Code:

Code:
sub FinderS
{
    #Üergabeparameter von der Sub 'Werteprüfer/Konstellation3' empfangen und speichern
    my ($art,$rechnr_von) = @_;
    
    
    #Lokale Variablen
    my $linecounter = 0;    #$linecounter -> Anzahl Einträge gesamt
    my $hitcounter = 0;     #$hitcounter  -> Anzahl Treffer

    #Archiv mit Fehlerabfrage Öffnen
    unless (opendir (DIR, $archivpfad) )
    {
        print $cgi->header(),
        $cgi->start_html('|-Fehler-|'),
        $cgi->b("Fehler beim Lesen des Archives<br>"),
        $cgi->div("Bitte melden Sie diesen Fehler dem Administrator!<br>"),
        $cgi->a({-href =>'../hilfe.html#kontakt', -target =>'_blank'},'Jetzt melden<br><br>'),
        $cgi->end_html();
        
        last;
    }
    #Wenn das Archiv erfolgreich geöffnet wurde
    
    
    #Am Anfang einmal den header und html starten, am Ende der Schleife wieder schließen
    #das bewirkt, dass der header nicht bei jedem Schleifendruchgang ausgegeben wird !!
    print $cgi->header(),
    $cgi->start_html('|-Verarbeitung-|');
    
    #Verzeichnis zeilenweise einlesen
    foreach my $line (readdir (DIR) )
    {
        $linecounter++;
        
        #Folgendes muss im Dateinamen enthalten sein:
        #art->RG/LS | $rechnr_von->gesuchte Nr.
        if ( ($line =~ /[$art]/) && ($line =~ /($rechnr_von)/) )
        {
            $hitcounter++;
            
            #In dieser Subroutine werden im Dateinamen # durch _ ersetzt und die Treffer ausgegeben
            &Dateiumbenennen($line);            
            
        }
        
        #Entspricht die Datei nicht den Suchkriterien wird weitergesucht
        else
        {
            next;
        }
        
    }#foreach
    #Am Ende der Foreach-Schleife html beenden
    print $cgi->end_html();
    
    #Schließen des Archives
    closedir DIR;
    
    
    #Setzen der Variable $chooser und aufruf der Sub &Infochooser
    my $chooser = 'S';    
    &Infochooser($chooser,$linecounter,$hitcounter,$art,$rechnr_von);
}

Die Sub FinderS ruft nochmals eine Sub auf, die Dateiumbenennen heist und am Ende wird in eine Sub namens Infochooser gesprungen, diese gibt nochmals die Suchanfrage, die gesamten Einträge und die Treffer aus. In dieser Sub wird nochmals ein header gesendet, habe diesn schon mal auskommentiert aber dann fällt die komplette ausgabe weg ...

Code:
sub Dateiumbenennen
{
    #Übergabeparameter von den FinderSubs empfangen und speichern
    my ($line) = @_;
    
    #Datei umbenennen, '#' durch '_' ersetzen
    my $old_file = $archivpfad . '/' . $line;
    my $new_file = $old_file;
    $new_file =~ s/#/_/g;   #ersetzt '#' durch '_'
            
            
    if ($old_file ne $new_file)
    {
        my $exitstate = move($old_file, $new_file); #umbenennen
        #my $exitstate = copy($old_file, $new_pfad . '/' . $new_file); #kopieren, umbenennen
                
        #Aufsplitten von new_file (filename verkürzung) in Sub Namesplitter
        my $file = &Namesplitter($new_file);
                
        #$file ist der verkürtzte Dateiname der Angezeigt wird und auf $new_file wird verlinkt, da hier der komplette Dateiname hinterlegt ist
        print $cgi->a({-href =>"http://lnxmt01:12345/archiv/$new_file", type =>'application/adobereader', target =>'_blank'}, "$file<br>"),                
    }
    else
    {
        #Fehlermeldung falls die Datei nicht umbenannt werden konnte
        print $cgi->b("Fehler beim Umbenennen<br>"),
    }
}

Die Sub Dateiumbenennen ruft eine Sub Namesplitter auf, diese jedoch enthält nur reinen Perlcode, hat also keinerlei Einfluss auf die CGI-Ausgaben.

So sieht derzeit die Ausgabe aus:
416520_20051220_RG_.pdf
416520_20051222_RG_.pdf
416520_20051228_RG_.pdf
Content-Type: text/html; charset=ISO-8859-1 <-- Eben diese Ausgabe ist das Problem

Insgesamt [36] Einträge davon [3] Treffer

Sie haben folgende Anfrage gestellt:
Art: RG
Nr von: 416520

Zurück zum Rechnungsarchiv



Ich danke dir für deine unterstützung.
Andreas
 
Zuletzt bearbeitet:
Zurück