ubuntuusers.de

Grafiken mit Perl-CGI und Apache ausgeben

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

Helmut_Seidel

Anmeldungsdatum:
7. Oktober 2005

Beiträge: 123

Hallo zusammen,

ich versuche gerade verzweifelt Grafiken über ein Perl-CGI-Script auszugeben. Folgenden einfachen Code habe ich versucht:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl -w

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

print <<HTML_ENDE;
<html>
<head>
<title>Grafik ausgeben</title>
</head>

<body>
<h1>Grafik ausgeben</h1>
<hr>
<img src="/home/helmut/cgi_prg/mapdata/tmp/MS1253549587.jpg">
<hr>
</body>
</html>
HTML_ENDE

Die Überschrift sowie die horizontalen Linien werden korrekt ausgegeben, an Stelle der Grafik erscheint allerdings ein Broken-Image-Symbol. Lasse ich mir den Seitenquelltext im Browser anzeigen, kopiere diesen in eine html-Datei, dann wird die Grafik angezeigt.

Ich vermute, dass es sich um eine Apache2-Einstellung handelt?

Kann mir jemand einen Tipp geben?

Danke Helmut

Moderiert von "xabbuh":

Thema ins passende Forum verschoben. Bitte beachte die als wichtig markierten Themen „Welche Themen gehören hier her und welche nicht?“, Danke!

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Wenn du Apache nutzt, dann hat deine Seite einen sogenannten Document Root Verzeichnis. Dieses gibt an was als "/" angesehen werden soll. Default bei Debian und wohl hoffenltich auch noch Ubuntu ist "/var/www" das Document Root verzeichnis.

Wenn du nun eine Datei dort hinein kopierst und diese über den Apache aufrufst, dann bedeutet der Pfad "/home/helmut/cgi_prg/mapdata/tmp/MS1253549587.jpg" nicht der Pfad im Dateisystem, sondern dies ist der Pfad von deinem Document Root aus gesehen, sprich von /var/www.

Daher mit der Angabe versuchst du real die datei "/var/www/home/helmut/cgi_prg/mapdata/tmp/MS1253549587.jpg" zu öffnen.

Korrekt wäre es wenn du z.B. deine genannte Datei als "index.html" unter "/var/www" abspeicherst. Danach gehst du hin und erzeugst unter "/var/www/" den Ordner "images" und kopierst dein Bild dort hinein.

In deiner HTML Datei musst du dann den Pfad "/images/MS1253549587.jpg" nutzen um dein Bild anzeigen zu lassen.

Helmut_Seidel

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2005

Beiträge: 123

Hallo Sid,

zunächst danke für deinen Tipp - bei einem analogen php-skript hab' ich's so hingekriegt. Bei meinem Perl-Skript hat sich nichts geändert. Ich hab jetzt folgendes Minimalprogramm erstellt:

1
2
3
4
5
6
7
8
9
#!/usr/bin/perl -w

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

print "<HTML>";
print "<HEAD><TITLE>Testseite</TITLE></HEAD>";
print "<BODY><HR>";
print '<img src="/cgi_prg/bild.jpg">';
print "<HR></BODY></HTML>";

Das Ergebnis ist nach wie vor das Broken-Image-Symbol. Der Pfad wird allerdings scheinbar korrekt als "http://localhost/cgi_prg/bild.jpg" angezeigt. Auf dem Verzeichnis, das ich verwende haben ich einen Script-Alias gelegt. Kann es sein, dass noch eine Apache-Einstellung vorgenommen werden muss?

Danke Helmut

tischbein

Avatar von tischbein

Anmeldungsdatum:
21. Juli 2008

Beiträge: 404

Helmut_Seidel schrieb:

Das Ergebnis ist nach wie vor das Broken-Image-Symbol. Der Pfad wird allerdings scheinbar korrekt als "http://localhost/cgi_prg/bild.jpg" angezeigt. Auf dem Verzeichnis, das ich verwende haben ich einen Script-Alias gelegt. Kann es sein, dass noch eine Apache-Einstellung vorgenommen werden muss?

Bei einem Script-alias werden alle enthaltenen Dateien wie ausführbare Dateien behandelt (vorausgesetzt sie besitzen das x-bit). D.h., Dein JPEG-Bild wird wie ein Programm, statt als Bild gehandhabt. Einfache lösung lautet, alles was nicht ausgeführt und nur angezeigt werden soll, in einen separaten Ordner zu packen.

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Wenn "/cgi_prg" ein CGI Alias ist, dann kannst du dort nicht Bilder einfügen. Bei einem CGI Alias werden alle Dateien als ausführbar angesehen und versucht auszuführen. Können Sie nicht ausgeführt werden dann liefert der Webbrowser gar nichts zurück.

Daher probiere es wie gesagt so aus das du dein ausführbares programm zwar in deinen ordner legst wie du ihn jetzt hast. Dein Bild muss aber (sofern du Document Root nicht verändert hast) ins /var/www Verzeichnis und nicht in das verzeichniss wo dein Programm liegt.

Daher wie bereits empfohlen lege z.B. unter "/var/www" den Ordner "images" an, und kopiere das Bild dann dort hinein und der Pfad halt "/images/...jpg"

Nebenbei möchte ich noch erwähnen, das CGI Programmierung nicht gerade sehr elegant ist. Zumindest wäre es schonmal ein Anfang wenn du ein Framework nutzt zur Webprogrammierung, zum Beispiel CGI::Application was das ganze CGI Handling besser abstrahiert und dazu verleitet etwas sauberer zu Programmieren. Ansonsten hat CGI generell das Problem das du so wie du jetzt dabei bist in einer Laufenden Umgebung Apache etc. Programmieren musst. Was umständlich und unhandlich ist.

Noch besser wäre es du würdest dir mal Catalyst anschauen. Zur Entwicklung wird auch gleich ein eigener Webserver mitgeliefert womit du einfach und unabhängig entwickeln kannst. Natürlich kostet es Zeit sich dort einzuarbeiten. Die Zeit ist aber gut investiert.

Helmut_Seidel

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2005

Beiträge: 123

Hallo Sid Burn, hallo Tischbein,

danke für eure Antworten und Tipps - ihr habt recht mit /var/www/images geht's. Danke auch für die Tipps mit CGI::Application und Catalys, hab's mir gerade angeschaut und finde, dass das gut aussieht.

Helmut

Antworten |