Daniel : Fileupload unter UNIX geht nicht

Hallo,
ich fummle an der Sache jetzt 2 Tage rum und weiss nicht mehr weiter:
Problem: Will einen http-Formular gesteuerten Fileupload realisieren. Die Standardsyntax ist mit klar:

my $cgi = new CGI;
my $dateiadresse = $cgi->param("dateiadresse");

open (BILD, ">$speicheradresse")or die print "Kann die Bilddatei nicht erstellen: $!\n";

binmode $dateiadresse; #Dateiadresse auf dem Client
binmode BILD;

while(<$dateiadresse>) {
  print BILD;
}

close (BILD);

Fakten: Unter meinem Testsystem (Win98, Apache2, ActiveState Perl 5.6) funktioniert es (auch wenn ich das ganze von einem anderen Rechner aus unserem Netzwerk mache). Unter Redhad Linux mit einem unbekannten Perl (das aber das Modul CGI hat) wird die Datei angelegt, es wird aber nichts reingeschrieben.
Nach zwei Tagen Nachdenken ist mir auch klar warum. Mit dem Filehandle <$dateiadresse> kann der Server nichts anfangen da er ja Zugriff auf den Client bräuchte um die Datei auszulesen. Aber warum geht es dann unter Windows? Und warum funktionieren alle Uploadprogramme die man runterladen kann genau auf diese Weise? Es wäre notwendig ein Filehandle das eine Verbindung zwischen Perl und der Clientdatei aufrechterhält anzulegen, aber wie soll das gehen?

Den kritische Codeteil:

while(<$dateiadresse>) {
  print BILD;
}
habe ich in den letzten Tagen dauernd permutiert. Die Selfhtml-Variante:

my $data;
while(read $file,$data,1024) {
  print DAT $data;
}
geht auch nicht. Auch:

while(<$dateiadresse>) {
binmode LOCAL;
   print LOCAL $_;
}
geht nicht.
Keine Ahnung was ich jetzt noch ausprobieren soll.
Kann mit jemand helfen?
Danke
Daniel

  1. Hi Daniel,

    Nach zwei Tagen Nachdenken ist mir auch klar warum.
    Mit dem Filehandle <$dateiadresse> kann der Server
    nichts anfangen da er ja Zugriff auf den Client
    bräuchte um die Datei auszulesen.
    Aber warum geht es dann unter Windows?

    weil Du dort in Wirklichkeit gar keinen Upload machst,
    sondern ein "copy".

    Du bist bisher im völlig falschen Film. Alles, was Dein Skript versucht hat, ging davon aus, daß es eine Datei zu verarbeiten hat. Dies ist aber _nicht_ der Fall.

    Und warum funktionieren alle Uploadprogramme die man
    runterladen kann genau auf diese Weise?

    Tun sie das? Ich vermisse in Deinem Skript das Analysieren eines MIME-Multipart-Blocks ...

    Es wäre notwendig ein Filehandle das eine Verbindung
    zwischen Perl und der Clientdatei aufrechterhält
    anzulegen, aber wie soll das gehen?

    Überhaupt nicht.

    Dein Upload-Formular muß ein Dialog-Element vom Typ "file" enthalten. Dies wertet der Browser dann so aus, daß er lokal die gesamte Datei (nicht nur deren Namen!) liest und in einen MIME-Multipart-Block verpackt (was Du im <form>-Element so definieren mußt).

    Dieser Block wird via POST zum Server gesendet, und zwar an den URL Deines Skriptes, welches ihn über die CGI-Schnittstelle empfängt.

    Nun hat Dein Skript die Aufgabe, diesen Multipart-Block zu verstehen (da steht u. a. der Dateinamen drin, aber auch der gesamte Inhalt) und das zu tun, was es tun soll. Beispielsweise, eine Datei mit dem empfangenen Namen zu öffnen und die Daten dort hinein zu schreiben.

    Viele Grüße
          Michael