nochmal pdf-datei mit perl an browser zurückgeben
Torsten
- perl
0 Klaus Mock0 Torsten
0 Torsten0 Torsten0 Klaus Mock0 Torsten0 Linksetzer0 FrankS0 Klaus Mock
hallo zusammen,
also mein problem hab ich ja schon beschrieben, ich will durch eine Formular eine pdf-datei aufrufen,
die durch ein perl-script an den browser zurückgegeben wird.
das ganze läuft auf einem windows nt server mit iis4 und active perl.
also ich habe jetzt cgi.pm benutzt, aber ich bekomme das mit dem perldoc -f binmode nicht hin,
hier noch mal mein scipt:
#!/perl/bin/perl -w
use strict;
use CGI ':standard';
my $nummer = param('nummer');
if ($nummer == 001160)
{
print header('application/pdf');
open (FILE,"4008420.pdf") die "Can't Open 4008420.pdf!\n";
perldoc -f binmode;
}
schon mal danke an Cheatah
vielleicht hat einer noch ne idee, was hier falsch ist oder noch fehlt, ach und wo muß die pdf-datei eigentlich liegen (welcher Ordner)?
Hallo,
das ganze läuft auf einem windows nt server mit iis4 und active perl.
ist praktisch unerheblich, außer das mit dem binmode ;-)
also ich habe jetzt cgi.pm benutzt, aber ich bekomme das mit dem perldoc -f binmode nicht hin,
merke: wenn hier irgendwer 'perldoc' schreibt, dann man er "Starte eine Shell ( eq 'Eingabeaufforderung') und gib das dort ein". 'perldoc' ist ein Zusatzprogramm von Perl, um die beiliegende Dokumenation lesen zu können. 'perldoc -h' gibt eine Hilfe dazu aus. Du kannst natürlich auch die Dokumenationen in HTML lesen, ist bei der Activestate-Distribution dabei.
Es gibt noch eine interpretation von perldoc: "Das steht in der Doku sieh dort nach".
Es ist definitiv keine Perl-Funktion.
perldoc -f binmode
heißt konkret "Siehe in der Dokumenation von Perl nach. Lese nach was dort zur Funktion binmode steht"
vielleicht hat einer noch ne idee, was hier falsch ist oder noch fehlt, [...]
Der Ablauf ist m.E. falsch. Du solltest nicht nur prüfen ob $nummer gültig ist, sondern auch ob die Datei überhaupt existiert, _bevor_ Du Dich auf den PDF-MIME-Type festlegst.
Und Du solltest im Fehlerfalle eine HTML-Seite zurückschicken.
So wie Du es machst, schickst Du die Fehlermeldung erst _nach_ der Ausgeabe des PDF-Headers, und daß sich dann der Browser nicht auskenn ist klar.
[...] ach und wo muß die pdf-datei eigentlich liegen (welcher Ordner)?
Also ich denk mal, auf einer lokalen Platte des Servers. So wie Du das im Code gemacht hast, liegt die Datei im Script-Verzeichnis. Das halte ich für nicht sonderlich schlau.
Grüße
Klaus
Ja das mit dem perldoc -f binmode war wohl nur nen verständnis problem, ich habe das jezt geändert,
in der meiner anderen antwort is das neue, das schon besser geht, aber immer noch nicht richtig klappt
ok,
ich hab jetzt schon mal was neues,
ich hab einfach die folgende Zeile geändert:
open (FILE,"4008420.pdf") die "Can't Open 4008420.pdf!\n";
perldoc -f binmode;
in diese:
open (FILE,"4008420.pdf:raw") die "Can't Open 4008420.pdf!\n";
# perldoc -f binmode; und diese löschen!!!
dann wird immerhin schon mal acrobat reader gestartet,
es gibt nun aber die Fehlermeldung: 'Beim Öffnen dieses Dokuments ist ein Fehler augetreten. Es ist ein
Dateilesefehler augetreten'. Außerdem gibt mir das script immer noch die Fehlermeldung
'The Document contained no Data. Try again later or contact the server‚s administrator'.
Also was is denn hier noch falsch?
Noch als Info,
es wird jetzt versucht, die script datei im acrobat reader anzuzeigen, wobei natürlich ein Fehler
auftaucht, wie kann ich es jetzt also machen, das die pdf datei angezeigt wird?
es läuft,
der fehler lag woanders und zwar müßen bei dem open befehl zwischen die verzeichnise
jeweils 2 backslash
if(open (FILE,"D:\InetPub\wwwroot\montageanleitungen\400842.pdf"))
danke nochmal!!! ;-)
Hi nochmal!
if(open (FILE,"D:\InetPub\wwwroot\montageanleitungen\400842.pdf"))
das:
if(open (FILE,"D:/InetPub/wwwroot/montageanleitungen/400842.pdf"))
sollte auch gehen.
Gruß Frank
Hallo,
»» open (FILE,"4008420.pdf") die "Can't Open 4008420.pdf!\n";
Grundsätzlich nicht daneben. Wie gesagt, liegt die Datei wirklich im gleichen Verzeichnis, wie das Script?
»» open (FILE,"4008420.pdf:raw") die "Can't Open 4008420.pdf!\n";
also ":raw" habe ich im Zusammenhang mit der open-Funktion noch nicht gesehen. Wo hast Du sowas her?
»» # perldoc -f binmode; und diese löschen!!!
Schon mal gut.
Nochmals:
Du mußt _zuerst prüfen, ob Du die PDF-Datei überhaupt ausgeben kannst. Dazu genügt nicht, $nummer zu prüfen. Kannst Du die Datei überhaupt einlesen.
Eigentlich wollte ich ja keinen Code hier herstellen, aber ich denke es wird wohl besser sein:
Ich gehe jetzt davon aus, daß die PDF-Datei im Ordner "D:\Dokumente\PDF" liegt
<code>
#!/perl/bin/perl -w
use strict;
use CGI ':standard';
my $nummer = param('nummer');
my($fehler) = "";
if ($nummer == 1160) # testen ob nummer falsch
{
if(open (FILE,"D:\Dokumente\PDF\4008420.pdf")) # datei aufmachen
{
print header('application/pdf'); #erst jetzt pdf-header ausgeben
binmode FILE; # hier das ominoiese binmode
print while(<FILE>); # datei an den browser senden
close FILE; # Datei schliessen
exit; # hier koennen wir bereits aufhoeren, weil es gibt nicht mehr zu tun
}
else # wenn das oeffnen der datei nicht funktionierte
{
$fehler = "Datei konnte Nicht gelesen werden";
}
}
else # wenn die nummer falsch ist
{
$fehler = "Nummer falsch";
}
print header('text\html');
print "<html><body>$fehler</body></html>";
</code>
Das ist jetzt mal so hingeschrieben, könnte vielleicht noch dies oder das daran 'verbessert' werden, aber so sollte es zumindest funktionieren.
Noch etwas: Wenn Du jetzt einfach den Code unreflektiert hernimmst und sagst "Wunderbar, brauch ich nicht mehr weitersuchen", aber nicht verstanden hast, was in jeder Zeile passiert und warum das genau dort passiert, dann wirst Du beim nächsten script wieder auf die schnauze fallen, und beim übernächsten, und beim überübernächsten ...
Ich würde Dir empfehlen, zumindest in der Dokumentation von Perl nachszulesen, was die einzelnen Funktionen wirklich machen. Und dann solltest Du Dir auch ein gutes Buch kaufen, (O'Reilly hat da imho die besseren) um die Materie von Grund auf zu verstehen.
Nur so hingebastelt und dann hoffen, daß irgendwer sich schon erbarmt und das ganze geraderückt ist auf Dauer auch nicht das wahre.
Das sollst Du jetzt nicht als Angriff auf Dich werten, sondern einfach als Vorschlag.
Grüße
Klaus
»» open (FILE,"4008420.pdf") die "Can't Open 4008420.pdf!\n";
Grundsätzlich nicht daneben. Wie gesagt, liegt die Datei wirklich im gleichen Verzeichnis, wie das Script?
Sie liegt im gleichen Verzeichnis -> locale adresse: d:\inetpub\scripts
»» open (FILE,"4008420.pdf:raw") die "Can't Open 4008420.pdf!\n";
also ":raw" habe ich im Zusammenhang mit der open-Funktion noch nicht gesehen. Wo hast Du sowas her?
:raw diese anweisung habe ich im 'perldoc open' gefunden
Du mußt _zuerst prüfen, ob Du die PDF-Datei überhaupt ausgeben kannst. Dazu genügt nicht, $nummer zu prüfen. Kannst Du die Datei überhaupt einlesen.
Eigentlich wollte ich ja keinen Code hier herstellen, aber ich denke es wird wohl besser sein:
Danke
Ich gehe jetzt davon aus, daß die PDF-Datei im Ordner "D:\Dokumente\PDF" liegt
Sie liegt im Ordner d:\inetpub\scripts
if(open (FILE,"D:\Dokumente\PDF\4008420.pdf")) # datei aufmachen
das ist aber eine lokale adresse, die ich vom client so nicht nehmen kann, oder woher soll der client
das laufwerk d kennen?, ich habe dort mal die url eingegeben, also http://www..........
print header('application/pdf'); #erst jetzt pdf-header ausgeben
else # wenn das oeffnen der datei nicht funktionierte
{
$fehler = "Datei konnte Nicht gelesen werden";
}
}
else # wenn die nummer falsch ist
{
$fehler = "Nummer falsch";
}hier wird die fehlermeldung an den browser gesendet, wenn nicht ohnehin die pdf-datei gesendet wurde.
print header('text\html');
print "<html><body>$fehler</body></html>";
er läuft immer in die fehleranweisung hinein, und will als folge die script datei speichern -> 'text/html'
die pdf-datei wird überhaupt nicht "angefasst", obwohl pfad und dateiangebe richtig sind???
Noch etwas: Wenn Du jetzt einfach den Code unreflektiert hernimmst und sagst "Wunderbar, brauch ich nicht mehr weitersuchen", aber nicht verstanden hast, was in jeder Zeile passiert und warum das genau dort passiert, dann wirst Du beim nächsten script wieder auf die schnauze fallen, und beim übernächsten, und beim überübernächsten ...
keine sorge, ich bin jede einzelne zeile durchgegangen, und bei unklarheiten nachgeschaut
Ich würde Dir empfehlen, zumindest in der Dokumentation von Perl nachszulesen, was die einzelnen Funktionen wirklich machen. Und dann solltest Du Dir auch ein gutes Buch kaufen, (O'Reilly hat da imho die besseren) um die Materie von Grund auf zu verstehen.
Nur so hingebastelt und dann hoffen, daß irgendwer sich schon erbarmt und das ganze geraderückt ist auf Dauer auch nicht das wahre.
ein buch habe ich leider noch nicht, werde ich mir aber bestimmt noch anschaffen
Das sollst Du jetzt nicht als Angriff auf Dich werten, sondern einfach als Vorschlag.
Grüße
Klaus
Hi Torsten!
if(open (FILE,"D:\Dokumente\PDF\4008420.pdf")) # datei aufmachen
das ist aber eine lokale adresse, die ich vom client so nicht nehmen kann, oder woher soll der client
das laufwerk d kennen?, ich habe dort mal die url eingegeben, also http://www..........
Was geht den Client die 'Lokale Adresse' an, der muß (und sollte/darf) doch davon nichts wissen! Der Client sendet doch nur den Inhalt des Forms (mit der eingegebenen nummer). Wo das Dokument dann auf dem Server liegt, ist doch für den Client völlig unwichtig. Ausserden geht open nur im lokalen Filesystem, http://www... aber ist eine WebAdresse.
Wenn es so wie Klaus gepostet hat nicht geht, liegt der Fehler woanders, nicht am Script.
»» er läuft immer in die fehleranweisung hinein, und will als folge die script datei speichern -> 'text/html'
Also siehst Du die Fehlerausschrift "Datei konnte Nicht gelesen werden" oder "Nummer falsch" garnicht? Wenn Dir der Code Deines Scripts zum Download angeboten wird, dann ist der Server nicht richtig konfiguriert. Er startet dann nämlich nicht Perl und sendet die Ausgabe des Scripts zum Client sondern sendet das Script selbst als Textdatei. Dort musst Du offensichtlich noch etwas tun.
Gruß Frank
Hallo,
:raw diese anweisung habe ich im 'perldoc open' gefunden
ich habs nur bei binmode gefunden.
Ich gehe jetzt davon aus, daß die PDF-Datei im Ordner "D:\Dokumente\PDF" liegt
Sie liegt im Ordner d:\inetpub\scripts
Na wunderbar, ich habe das ja nur als Beispiel gedacht, deinen realen Pfad kannst Du wohl noch selbst eintragen.
das ist aber eine lokale adresse, die ich vom client so nicht nehmen kann, oder woher soll der client
das laufwerk d kennen?, ich habe dort mal die url eingegeben, also http://www..........
Du willst doch eine Datei von Deinem Server an den Client schicken, die Datei liegt aus Serversicht also lokal, deshalb sprichst Du sie auch mit dem lokalen dateinamen an. und mit open kanst Du keine Datei öffnen, die mit einen URL angesprochen wird. das sind zwei vollkommen verschiedene Sachen.
»» er läuft immer in die fehleranweisung hinein, und will als folge die script datei speichern -> 'text/html'
»» die pdf-datei wird überhaupt nicht "angefasst", obwohl pfad und dateiangebe richtig sind???
Ok. Mir ist da zwar ein Fehler unterlaufen, "D:\blablabla" in Gänsefüßchen ist nicht richtig, aber das ist dir sicher aufgefallen. Ich hab zwar dran gedacht aber dann offenbar doch vergessen.
heiße sollte es:
if(open (FILE,'D:\Dokumente\PDF\4008420.pdf')) # datei aufmachen
Wie weit kommt das script?
funktionieren andere?
sieh dir an was vom Server zurückgeschickt wird. Das Serverprotokoll solltest Du Dir auch ansehen.
Ehrlich gesagt, weiß ich nicht mehr wie ich da helfen soll. Grundsätzlich habe ich, so denke ich, einen möglichen Lösungsansatz vorgeschlagen. Ab hier mußt Du sebst weiter. Da kann Dir, so denke ich, keiner mehr wirklich helfen. Ich habe den Verdacht, daß das Dein erster Versuch ist. Du solltest Dich wirklich zuerst mit den Grundlagen des Servers, der Sprache und des HTTP-Protokoll auseinandersetzen. Ohne dieses Wissen wird alles, was Du weiter machst nur ein Schuß ins Blaue sein. Auch solltest Du Dich mal mit systematischer Fehlersuche auseinandersetzen.
Viele Grüße
Klaus