Perl-Problem
Dieter
Hallo an alle Perl-Profis!
ich suche einen fix für das folgende Problem:
Ich will die Möglichkeit zum upload von Bildern zur Verfügung stellen. Der dazu verwendete Code läßt derzeit aber leider alle Dateitypen zu. Wie kann ich den folgenden Code ändern, so das nur jpeg, gif, jpg-Dateien geladen werden können. (Code für den upload, nachdem ein User die Datei auf seiner Festplatte gewählt hat)
Nicht gelöst wurde das Problem durch Einfügen von z.B. :
&oops unless (("$buffer=~m/.jpg$/i") or ("buffer=~m/.jpeg$/i") or ("$buffer=~m/.gif$/i"));
oder:
( $extension = $filename ) =~ s/.*.// ;
if ( $extension !~ /(giftifjpgbmp)/i ) {&oops("Only image files (gif, tif, jpg, bmp) allowed") ;
Hier der Code für den upload:
mkdir("$basedir", 0777) unless (-M "$basedir");
$ = 1;
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
$buffer =~ /^(.+)\r\n/;
$bound = $1;
@parts = split(/$bound/,$buffer);
$filename=$parts[1];
$parts[1] =~ s/\r\nContent-Disposition.+\r\n//g;
$parts[1] =~ s/Content-Type.+\r\n//g;
$parts[1] =~ s/^\r\n//;
@subparts = split(/\r\n/,$parts[2]);
$directory = $subparts[3];
$directory =~ s/\r//g;
$directory =~ s/\n//g; #got the directory name
$filename =~ s/Content-Disposition: form-data; name="UploadedFile"; filename=//g;
@stuff=split(/\r/,$filename);
$filename = $stuff[1];
$filename =~ s/"//g;
$filename =~ s/\r//g;
$filename =~ s/\n//g;
@a=split(/\/,$filename);
$totalT = @a;
--$totalT;
$fname=$a[$totalT];
@a=split(///,$fname);
$totalT = @a;
--$totalT;
$fname=$a[$totalT];
@a=split(/:/,$fname);
$totalT = @a;
--$totalT;
$fname=$a[$totalT];
@a=split(/"/,$fname);
$filename=$a[0];
if($parts[1] !~ /[\w\d]/)
{
print "Content-Type: text/html\n\n";
print "<html>\n<title>Error!</title>\n";
print "<body bgcolor="#ffffff" text="#000000">\n";
print "You did not provide a file to be uploaded or it is empty.<BR>\n";
print "Press your browsers BACK button to try again.";
print "</html>\n";
exit 0;
}
$directory = $basedir;
open(REAL,">$directory$filename") &error($!);
binmode REAL;
print REAL $parts[1];
close(REAL);
if($windows ne 'yes') #chmod it for unix systems
{
chmod 777 $directory$filename
;
Hi,
Ich will die Möglichkeit zum upload von Bildern zur Verfügung stellen. Der dazu verwendete Code läßt derzeit aber leider alle Dateitypen zu. Wie kann ich den folgenden Code ändern, so das nur jpeg, gif, jpg-Dateien geladen werden können. (Code für den upload, nachdem ein User die Datei auf seiner Festplatte gewählt hat)
siehe <../../tchg.htm#a1>, beachte besonders das Stichwort "accept" ;-)
Nicht gelöst wurde das Problem durch Einfügen von z.B. :
[...]
Bitte keinen kompletten Scripts posten. Lieber als Textdatei auf den eigenen Server legen und einen Link darauf setzen - am allerbesten ist es aber immer noch, _ausschließlich_ die relevanten Stellen zu zitieren.
Ach ja, bitte auch in Zukunft eine Themenauswahl vornehmen, und "Problem" ließ noch nie Aufschluß über das Problem zu - also bitte einen aussagekräftigen Titel wählen ;-)
Cheatah
Hallo, Danke für die schnelle Hilfe, die unten gelisteten Zeilen (cgi-sub innerhalb eines Perl-scriptes), lassen dennoch das Hochladen aller Dateitypen (.txt, .pl usw) zu.
<form ACTION="../cgi-bin/upload1.pl" METHOD=POST ENCTYPE="multipart/form-data"> <input type=file NAME="UploadedFile" size=35 maxlength=100000 name="Datei" accept="image/*">
<input TYPE="SUBMIT" VALUE="Bild laden!">
<input TYPE="RESET" VALUE="Löschen"> </form>
Gruß
Dieter
Hi,
Hallo, Danke für die schnelle Hilfe, die unten gelisteten Zeilen (cgi-sub innerhalb eines Perl-scriptes), lassen dennoch das Hochladen aller Dateitypen (.txt, .pl usw) zu.
hm, stimmt, zumindest Netscape scheint accept zu ignorieren. Schade eigentlich. Nun, dann gehen wir doch einfach mal an einen Syntax-Check:
&oops unless (("$buffer=~m/.jpg$/i") or ("buffer=~m/.jpeg$/i") or ("$buffer=~m/.gif$/i"));
"$buffer=~m/.xyz$/i" dürfte immer true sein, sofern "$/i" keinen Fehler erzeugt - Du hast da nämlich einen String angegeben, keine Regular Expression. Laß die Anführungszeichen weg.
( $extension = $filename ) =~ s/.*.// ;
if ( $extension !~ /(giftifjpgbmp)/i ) {&oops("Only image files (gif, tif, jpg, bmp) allowed") ;
Hm, das klingt für mich plausibel, wobei die Erzeugung von $extension IMHO suboptimal ist (ich bin auch nicht zu 100% sicher, daß sie funktioniert, bin aber zu faul, daß jetzt auszuprobieren *g*). Versuche es mit
$extension = (split(/./,$filename))[-1];
if ...
Oder aber:
$filename =~ /.([^.]+)$/;
if ($1 !~ /.../) ...
Cheatah