Stefan: Frage zu dem Shelf Uploadscript

Hallo,

also ich poste am besten nochmal kurz das komplette Skript:

use strict;
use CGI; # Modul fuer CGI-Programme

my $cgi = new CGI; # neues Objekt erstellen

Content-type fuer die Ausgabe

print $cgi->header(-type => 'text/html');

die datei-daten holen

my $file = $cgi->param("myfile");

dateinamen erstellen und die datei auf dem server speichern

my $fname = 'file_'.$$.'_'.$ENV{REMOTE_ADDR}.'_'.time;
open DAT,'>'.$fname or die 'Error processing file: ',$!;

Dateien in den Binaer-Modus schalten

binmode $file;
binmode DAT;

my $data;
while(read $file,$data,1024) {
  print DAT $data;
}
close DAT;

print <<HTML;
<html>
<head>
<title>Fileupload</title>
</head>
<body bgcolor="#FFFFFF">
<h1>Die Datei $file wurde erfolgreich hochgeladen.</h1>

<p>
Die Datei $file wurde erfolgreich auf dem Server
   gespeichert.
  </p>
</body>
</html>
HTML

So nun zu meiner Frage, und zwar wird ja ein Objekt erstellt und anschließen in die Datei geschrieben. Aber wie bekomme ich das Tempfile weg, welches jedesmal zusätzlich erstellt wird?

Hat da einer ne kurze Lösung?

Mfg

Stefan

  1. Halihallo Stefan

    also ich poste am besten nochmal kurz das komplette Skript:

    einfacher wäre ein Link gewesen.

    So nun zu meiner Frage, und zwar wird ja ein Objekt erstellt und anschließen in die Datei geschrieben. Aber wie bekomme ich das Tempfile weg, welches jedesmal zusätzlich erstellt wird?

    indem du es löschst ;)
    Was willst du denn tun? - Kopierst du die Datei zuerst an ein anderes Ort? - Oder möchtest du den Dateiinhalt in einer Variablen (was ich nicht empfehlen würde)? - Wann brauchst du die Datei? - Noch im selben Script, oder später auch noch?

    Hat da einer ne kurze Lösung?

    while (<./mail_*.*>) {
       unlink($_);
    }

    Viele Grüsse

    Philipp

    1. Halihallo Stefan

      Hat da einer ne kurze Lösung?

      while (<./mail_*.*>) {
         unlink($_);
      }

      also, wenn du die Datei noch in derselben Script-"instanz" löschen willst,

      my $fname = 'file_'.$$.'_'.$ENV{REMOTE_ADDR}.'_'.time;

      => unlink($fname);

      ;-)

      Ist IMO am sichersten, denn sonst löschst du eventuell auch andere Dateien, die mit 'mail_' anfangen. Wenn du einfach irgendwann alle temp-files löschen willst, tät ich folgendes vorschlagen:

      my $fname = './temp/file_'.$$.'_'.$ENV{REMOTE_ADDR}.'_'.time;

      dann kannst du ohne grössere "Verluste" einfach alle <./temp/*> löschen (oder noch besser, du machst eine Extension, die typisch ist => '.eml'), aber auch hier ist etwas Vorsicht geboten: Eine andere Instanz könnte eben genau noch eine temporäre Datei nicht kopiert haben => Datenverlust. Du musst dir, bevor du fragst, wie man Dateien los wird, überlegen, was du mit ihnen überhaupt machen willst (davon hast du nämlich nix gesagt). Ich nehme an, dass du die upgeloadeten Files auch irgendwo speichern willst, sonst würde der Upload ja keinen Sinn ergeben ;) Frage ist hier nur, wo und wie du das machen willst.

      Viele Grüsse

      Philipp

  2. Hi,

    So nun zu meiner Frage, und zwar wird ja ein Objekt erstellt und
    anschließen in die Datei geschrieben. Aber wie bekomme ich das
    Tempfile weg, welches jedesmal zusätzlich erstellt wird?

    Gegenfrage: Wie bekommst Du die zweite Datei weg (statt der ersten)?
    Indem Du sie gar nicht erst erzeugst, sondern die erste umbenennst ...

    Viele Grüße
          Michael