Yakumo: Dateiname bei Dateiupload

Hallo,

ich hab ein Script im www gefunden, mit dem ich eine Datei mittels HTML-Formular hochladen kann, allerdings geht die Dateiendung/-typ der Datei dabei verloren.

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 = 'DATEI_'.$$.'_'.$ENV{REMOTE_ADDR};
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;

ich hab es schon mit
$fname=$cgi->param("myfile");

probiert, dabei bleibt die Dateiendung erhalten, allerdings ergbit der Name keinen Sinn...

und das ging leider auch nicht:
$fname=$cgi->param("myfile");
$fname='Datei_'.$fname; #"Datei_" stand nicht im Anfang des Namen

Habt ihr eine Idee?

Yakumo

  1. Hell-O!

    ich hab ein Script im www gefunden, mit dem ich eine Datei mittels HTML-Formular hochladen kann, allerdings geht die Dateiendung/-typ der Datei dabei verloren.

    Nur die Endung geht verloren, der Typ bleibt erhalten.

    $fname=$cgi->param("myfile");
    dabei bleibt die Dateiendung erhalten, allerdings ergbit der Name keinen Sinn...

    Was heißt "ergibt keinen Sinn"?

    Habt ihr eine Idee?

    Hast du dir schon mal die Dokumentation zu CGI.pm angesehen? Da steht u.a.:

    "Different browsers will return slightly different things for the name. Some browsers return the filename only. Others return the full path to the file, using the path conventions of the user's machine. Regardless, the name returned is always the name of the file on the user's machine ..."

    Lass dir doch einfach mal den übermittelten Dateinamen ausgeben.

    Siechfred

    1. Lass dir doch einfach mal den übermittelten Dateinamen ausgeben.

      da muss ich mal ganz dumm fragen: Wie komm ich an den Namen?

      Yak

      1. Lass dir doch einfach mal den übermittelten Dateinamen ausgeben.
        da muss ich mal ganz dumm fragen: Wie komm ich an den Namen?

        print $cgi->param('name_des_auswahlfeldes');

        (Kurzform)

        Siechfred

        1. Der Name des Feldes ist "myfile"

          <input type='file' name='myfile' accept='text/*' maxlength='2097152'>

          Ich hab es mal umbenannt, aber dann kann er die Datei nicht abspeichern...
          versteh ich nich ganz...

          Yak

          1. Der Name des Feldes ist "myfile"

            gut

            <input type='file' name='myfile' accept='text/*' maxlength='2097152'>

            Ich hab es mal umbenannt, aber dann kann er die Datei nicht abspeichern...
            versteh ich nich ganz...

            Was ergibt: print CGI::param('myfile');

            sind da (wie dir ja schon gesagt wurde) evtl. die Pfade dabei?

            Du solltest sowieso nicht den Clientdateiennamen benutzen, da du nicht weißt von was für einen System dieser stammt und ob der Namen nicht Zeichen enthält, die auf dem Server nicht in Dateinamen verwendet werden dürfen.

            Struppi.

            1. Was ergibt: print CGI::param('myfile');

              sind da (wie dir ja schon gesagt wurde) evtl. die Pfade dabei?

              ich trau mich ja kaum zu fragen, aber genau find ich raus, was param(...) ergibt? Konsole kann ich doch nicht nutzen? Und der Name der Datei ist z.b. "DPTR7I~Q.DOC".

              Du solltest sowieso nicht den Clientdateiennamen benutzen, da du nicht weißt von was für einen System dieser stammt und ob der Namen nicht Zeichen enthält, die auf dem Server nicht in Dateinamen verwendet werden dürfen.

              wenn ich das problem geschafft hätte, würde ich nach einem punkt suchen, und dann die Dateiendung weiterverwenden...

              Yak

              1. Was ergibt: print CGI::param('myfile');

                sind da (wie dir ja schon gesagt wurde) evtl. die Pfade dabei?

                ich trau mich ja kaum zu fragen, aber genau find ich raus, was param(...) ergibt? Konsole kann ich doch nicht nutzen? Und der Name der Datei ist z.b. "DPTR7I~Q.DOC".

                Du kannst den Wert doch ausgeben und im Browser anzeigen lassen.

                Du solltest sowieso nicht den Clientdateiennamen benutzen, da du nicht weißt von was für einen System dieser stammt und ob der Namen nicht Zeichen enthält, die auf dem Server nicht in Dateinamen verwendet werden dürfen.

                wenn ich das problem geschafft hätte, würde ich nach einem punkt suchen, und dann die Dateiendung weiterverwenden...

                ich red nicht von Dateiendungen (die es z.b. im Mac gar nicht gibt), sondern von Sonderzeichen.

                Struppi.

                1. Du kannst den Wert doch ausgeben und im Browser anzeigen lassen.

                  Also dahinter versteckt sich der Pfad zu zur Datei...
                  Aber ich versteh nicht, warum das kein String ist, ich dachte perl wandelt es so um, wie ich es brauche, oder kann ich ihm explizit sagen, dass er einen String drauß machen soll?
                  Wenn der Browser den Pfad angibt, dann müsste es doch eine Zeichenkette sein. Aber wieso speichert Perl die Datei nicht mit diesem Namen ab, wegen der Backslashes´?

                  ich red nicht von Dateiendungen (die es z.b. im Mac gar nicht gibt), sondern von Sonderzeichen.

                  die seiten sind nur im intranet zu erreichen, und da werden nur PCs benutzt, von daher ist es nicht ganz so dringend...

                  Yak