Swen: Scriptfehler ?

Hallo,

ich habe ein kleines Script, mit dem Textdaten ausgegeben werden. Zum Aufruf des Scriptes in HTML möchte ich den img-Tag verwenden. Bei dem muss aber ja das Script ein Bild zurückgeben.

Nun habe ich dafür dieses Script "gebastelt":

#!/usr/bin/perl

use CGI;

print "Content-type: text/plain\n\n";
$numm = param('num');
$file = '../ads/bannerclick'.$numm.'.inc';
open(INFO, $file);  # File öffnen
@lines = <INFO>;  # in Array einlesen
close(INFO);   # File schliessen
print @lines;   # Array ausgeben

print "Content-type: image/gif\n\n";
open (GIF, "http://www.xyz.de/Pics/blind.gif") || die "not found $!";
@pic=< GIF >;
print @pic;
close (GIF);

Leider funktioniert es nicht. Die Daten der .inc-Dateien werden nicht ausgegeben. Und das 1x1-gif wird auch nicht ausgegeben.

Vielleicht kann mir hier jemand helfen ?

Danke,
Swen

  1. #!/usr/bin/perl

    use CGI;

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

    Soll das nicht ein Bild sein? Dafür ist schonmal der MIME-Typ falsch.

    $numm = param('num');

    Das geht so nicht. du musst erst die funktion 'param' in den aktuellen Namespace importieren. Am einfachsten ist es ganz oben

    use CGI qw/:standard/;

    zu verwenden. Außerdem ist

    use CGI::Carp qw/fatalsToBrowser/;

    auch recht nützlich. Mehr findest du in 'perldoc CGI'.

    greg

  2. Hi Swen,

    ich habe ein kleines Script, mit dem Textdaten ausgegeben werden. Zum Aufruf des Scriptes in HTML möchte ich den img-Tag verwenden.

    Wie hast du das gelöst, vermutlich via SSI, oder?

    Nun habe ich dafür dieses Script "gebastelt":
    #!/usr/bin/perl

    Den Einstieg solltest du besser so schreiben:
    #!/usr/bin/perl -w
    use strict;
    use warnings;
    use CGI::Carp qw(fatalsToBrowser);

    use CGI;

    Da du offenbar nur die param-Funktion benötigst, ist es so besser:

    use CGI qw(param);

    print "Content-type: text/plain\n\n";
    $numm = param('num');

    Das geht nur, wenn du CGI.pm so einbindest, wie ich oben schrieb. So wie du CGI.pm aktuell eingebunden hast, muss das meiner Meinung nach hier scheitern, denn in dem Fall müsstest du erst ein neues CGI-Objekt erzeugen:

    my $query = new CGI;
    my $numm = $query->param('num');

    Siehe: http://www.perldoc.com/perl5.8.0/lib/CGI.html#PROGRAMMING-STYLE

    Und denke daran, die Fehler beim Öffnen der Dateien abzufangen (mindestens open ... or die $!;). Und nicht zuletzt solltest du auch mal einen Blick in deine error.log werfen.

    Viele Grüße
    Torsten

    1. Hallo,

      danke erstmal für die Scriptkorrekturen.
      Aber mein Grundproblem besteht noch:

      Zum Aufruf des Scriptes in HTML möchte ich den img-Tag
      verwenden.

      »»»»  Wie hast du das gelöst, vermutlich via SSI, oder?

      nein, eben nicht. Ich möchte, dass das Script per img-tag aufgerufen werden kann, also zb so:
      <img src="/cgi-bin/test.cgi?num=3" width="94" height="79">

      Ist es so, das Scripte, die Text zurückgeben, nicht mit dem img-Tag aufgerufen werden können ?

      Grüsse,
      Swen

      1. Hi Swen,

        nein, eben nicht. Ich möchte, dass das Script per img-tag aufgerufen werden kann, also zb so:
        <img src="/cgi-bin/test.cgi?num=3" width="94" height="79">

        Jepp, so geht's. Allerdings kannst du eine Grafikdatei nicht wie eine Textdatei einlesen und an den Client ausgeben. Vom Prinzip her müsstest du daher wie folgt vorgehen:

        print "Content-type: image/gif\n\n";
        open(IMG, "<$numm.gif") or die $!;
        binmode(IMG);
        while(read IMG,$buf,1)
        {
          print $buf;
        }
        close IMG;

        Wichtig ist die Funktion binmode, damit deine Grafikdatei korrekt verarbeitet werden kann:
        http://selfhtml.teamone.de/cgiperl/funktionen/einausgabe.htm#binmode

        Viele Grüße
        Torsten

        1. Hallo Thorsten,

          Vom Prinzip her müsstest du daher wie folgt vorgehen:

          print "Content-type: image/gif\n\n";
          open(IMG, "<$numm.gif") or die $!;
          binmode(IMG);
          while(read IMG,$buf,1)
          {
            print $buf;
          }
          close IMG;

          OK. Und wie bekomme ich das Script nun noch dazu, zusätzlich einen Text auszugeben ? Aber als Text, nicht als einen in Grafik konvertierten Text oder so etwas ?

          Grüsse,
          Swen

          1. Hi Swen,

            OK. Und wie bekomme ich das Script nun noch dazu, zusätzlich einen Text auszugeben ? Aber als Text, nicht als einen in Grafik konvertierten Text oder so etwas ?

            Das geht so ohne weiteres nicht, entweder Grafik oder Text. Dazu muss dein Script dann schon eine Weiche haben. Je nachdem, mit welchem Parameter du es ausführen lässt, wird entweder dein Text oder dein Bild ausgegeben. Beides gleichzeitig wird scheitern.

            Viele Grüße
            Torsten