Hallo Zusammen
Habe jetzt mal ein File Upload gebasstelt mit der man Datein mit sonderzeichen (ne ganze Menge) hochladen kann.
also zb. so eine Datei:
!#$&'()+,- =üäÄÜñÑóé.jpg
Diese wird dann korreckt von bp angezeigt.
Zudem kann man die zugelassende Datei größe bestimmen. In der Form, das die Datei hochgeladen wird, dann wird überprüft ob sie zu groß ist, wenn zu groß, wird die Datei gleich wieder gelöscht. Das selbe verfahren wird mit der Endung gemacht. Und wer Lust hatt kann es mit der Breite und Höhe des Bildes genauso machen.
Das ganze habe ich als Sub zusammengebastellt.
Würde mich freuen wenn die Perl Spezis, Sander , CB etc. sich das script mal ansehen und natürlich verbessern und erweitern.
Da ich nun mal bultiger Anfänger in sachen Perl bin.
Hier das Sript:
<perl>
sub upfile {
# ---- Variabeln müssen angepasst werden ----------- #
# Datenbank zum Bild zwischenspeichern
$dbbild="/domain.de/bild";
# Variable zum durchschleifen der Daten für die Orginal Datenbank
# Diese 4 Variablen müssen vor dem Aufruf der Sub gefüllt werden.
# $dborginal Orginal Datenbank in der das File gespeichert werden soll
# $dbid Id des Datensatzes der orginal Datenbank zum entgültigen speichern des Bildes via mod
# $dbdf Name des Dateifeldes der Orginal Datenbank
# $dbnf Name des Feldes für den umgewandelten Datei Namen der Orginal Datenbank
$up_schleife="&dborginal=$dborginal&dbid=$dbid&dbdf=$dbdf&dbnf=$dbnf";
# Zulassen von Dateitypen. Bei diesen drei wird die Breite und Höhe ermittelt.
# Es können weitere hinzugefügt werden, bei denen wird dann aber nicht die B/H ermittelt.
$erlaubte_dateitypen = "gif|jpg|png";
# Maximale Größe in Byts die das Hochgeladene Bild haben darf.
$filemax="100000"; # entspricht 100 Kb
# Link zu dem File Verzeichniss
$f_link="http://www.domain.de/files";
# ---- ende ----------- #
$maxg=$filemax/1000; # Umrechnen der Byts in Kb
# Aufruf des Formulars wenn neues Foto oder anderes Foto gewünscht
# Wenn ein anderes Bild gewünscht wird erst das alte Bild löschen
if ($_put{up_Id} ne "")
{
mod "Id==$_put{up_Id}",["up_bild","","_filec_bild","1"],"$dbbild";
del "Id==$_put{up_Id}","$dbbild";
}
# dann das Formular zu upload ausgeben.
&formularfile();
}
# ---- Ende neues / anders Bild -------------- #
# ---- Wenn ein Bild gewählt und überprüft wurde zum Orginal Datensatz hinzufügen.
if ($up_cmd eq "putbild")
{
get "Id==!$_put{up_Id}","$dbbild";
mod "Id==!$dbid",["$dbdf","$bild","_filec_bild","2","$dbnf","$bild_name"],"$dborginal";
del "Id==$_put{up_Id}","$dbbild";
# ---- Meldung ausgeben. Wer möchte kann hier auch noch ne Mail verschicken ---- #
out "<center><b>Ihr Foto wurde gespeichert</b></center>";
}
# ---- Ende Eintrag Orginal Datenbank ---- #
# ---- Wenn das Formular abgschickt wurde Datei speichen/überprüfen und Meldung ausgeben.
if ($up_cmd eq "vorschau")
# Überprüfen und Umwandeln von Sonderzeichen
Variabeln im Teil 2 des Posting da das Forum nicht so viel Text will.
# Zwichenspeichern der Datei
put ["bild", $_put{up_bild}, "bild_name", $bild1], "$dbbild";
get "bild_name==!$bild1" , "$dbbild";
# Überprüfen ob es eine zugelassene Dateiendung ist, wenn nicht Datei und Eintrag in db löschen.
if($bild !~ /.($erlaubte_dateitypen)/)
{
out "<br><br><center><b>Sie haben eine ungültige Datei ausgewählt.</br>";
out "Es werden nur Datein im Format $erlaubte_dateitypen akzeptiert<br><br></b>";
mod "Id==$Id",["bild","","_filec_bild","1"],"$dbbild";
del "Id==$Id","$dbbild";
&formularfile();
out "</center>";
} else {
# Wenn Dateiendung richtig, dann Datei hohlen und größe in Kb errechnen
$x=get "$f_link/$bild_name";
$dateig=length($x)/1000;
$dateigaus=sprintf('%.2f',$dateig); # auf 2 nachkommastellen
# Wenn die Datei die max. Dateigröße überschreitet, Datei und Eintrag in db löschen.
if (length($x) > "$filemax")
{
out "<br><br><center><b>Das von ihnen gewählte Foto hatt $dateigaus Kb und ist somit zu groß.</br>";
out "Es können nur Fotos gespeichert werden die max. 100 Kb groß sind.<br><br></b>";
mod "Id==$Id",["bild","","_filec_bild","1"],"$dbbild";
del "Id==$Id","$dbbild";
&formularfile();
out "</center>";
} else {
# Wenn Dateigröße und Endung Ok, dann Bild als Vorschau mit breite, höhe und Größe in Kb ausgeben
$name1="$bild_name";
@name = split(/\./,$name1);
if ($name[1] eq "gif")
{
my($w,$h)=&gifsize($x);
$wout="Breite: $w - Höhe: $h<br>";
} elsif ($name[1] eq "jpg") {
my($w,$h)=&jpegsize($x);
$wout="Breite: $w - Höhe: $h<br>";
} elsif ($name[1] eq "png") {
my($w,$h)=&pngsize($x);
$wout="Breite: $w - Höhe: $h<br>";
} else {
out "Dieses ist keine gültige Datei";
}
out "<center><b>Foto Name: $bild</b><br>";
out "<img src='$f_link/$bild_name'><br>";
out "Fotoeigenschaften:<br>";
out "$wout";
out "Dateigrösse: $dateigaus <br>";
out "<FORM name='bn' ACTION='baseportal.pl?htx=$htx&cmd=upfile$up_schleife' METHOD='post' ENCTYPE='multipart/form-data'>";
out "<INPUT TYPE='hidden' NAME='htx:=' value='$htx'>";
out "<INPUT TYPE='hidden' NAME='up_Id:=' value='$Id'>";
out "<INPUT TYPE='submit' NAME='Submit' VALUE='Ein anderes Foto wählen'></form><br>";
out "<FORM name='bs' ACTION='baseportal.pl?htx=$htx&cmd=upfile$up_schleife' METHOD='post' ENCTYPE='multipart/form-data'>";
out "<INPUT TYPE='hidden' NAME='up_cmd:=' value='putbild'>";
out "<INPUT TYPE='hidden' NAME='htx:=' value='$htx'>";
out "<INPUT TYPE='hidden' NAME='up_Id:=' value='$Id'>";
out "<input type='hidden' name='_filec_bild=' value=2>";
out "<INPUT TYPE='submit' NAME='Submit' VALUE='Dieses Foto speichern'></form><br>";
out "</center>";
}
}
# Hier die subs zum errechenen der Breite und Höhe
sub formularfile {
out <<EOF;
<BODY>
<FORM ACTION="baseportal.pl?cmd=upfile&htx=$htx$up_schleife" METHOD="post" ENCTYPE="multipart/form-data">
<INPUT TYPE="hidden" NAME="up_cmd:=" value="vorschau">
<INPUT TYPE="hidden" NAME="htx:=" value="$htx">
<input type="hidden" name="_filec_bild=" value=2>
<div align="center"><table bgcolor="#000000" width="550" cellspacing="0" cellpadding="0" border="0">
<tr><td>
<table cellspacing="1" cellpadding="2" border="0" width="100%">
<tr><td colspan="2" bgcolor="#000080">
<font face="Verdana, Arial" size="2" color="#ffffff"><b>Foto hinzufügen</b></font></td>
</tr><tr>
<td bgcolor="#F8F8F8"><font face="Verdana, Arial" size="2">Datei auswählen</font></td>
<td bgcolor="#F8F8F8"><INPUT TYPE="file" NAME="up_bild:="></td>
</tr><tr>
<td bgcolor="#F8F8F8" colspan=2><font face="Verdana, Arial" size="2">Es können nur Fotos im Format $erlaubte_dateitypen mit einer max. Größe von $maxg Kb gespeichert werden.</font></td>
</tr><tr>
<td bgcolor="#F8F8F8" colspan="2" align="center">
<INPUT TYPE="submit" NAME="Submit" VALUE="Bild Speichern"></td>
</tr></table>
</td></tr>
</table></div>
</FORM>
</BODY>
EOF
}
sub gifsize {
my ($GIF)=@_;
my ($type,$a,$b,$c,$d,$s,$width,$height) ;
$type=substr($GIF,0,6);
if(!($type =~ m/GIF8[7,9]a/) || (length($s=substr($GIF, 6, 4))!=4) ){
return;
}
($a,$b,$c,$d)=unpack("C"x4,$s);
$width= $b<<8|$a;
$height= $d<<8|$c;
return ($width,$height);
}
sub jpegsize {
my ($JPEG)=@ _ ;
my ($count)=2 ;
my ($length)=length($JPEG) ;
my ($ch)="" ;
my ($c1,$c2,$a,$b,$c,$d,$width,$height) ;
while (($ch ne "\xda") && ($count<$length)) {
while (($ch ne "\xff") && ($count < $length)) {
$ch=substr($JPEG,$count,1);
$count++;
}
while (($ch eq "\xff") && ($count<$length)) {
$ch=substr($JPEG,$count,1);
$count++;
}
if ((ord($ch) >= 0xC0) && (ord($ch) <= 0xC3)) {
$count+=3;
($a,$b,$c,$d)=unpack("C"x4,substr($JPEG,$count,4));
$width=$c<<8|$d;
$height=$a<<8|$b;
return($width,$height);
} else {
($c1,$c2)= unpack("C"x2,substr($JPEG,$count,2));
$count += $c1<<8|$c2;
}
}
}
sub pngsize {
my $Buffer = shift;
my ($width,$height) = ( undef, undef );
if ($Buffer =~ /IHDR(.{8})/) {
my $PNG = $1;
($width,$height) = unpack( "NN", $PNG );
}
return ($width,$height);
}
}
}
Ich werde es in den nächsten Tagen noch mal überarbeiten und dann in die BIB stellen.
Gruß aus Chile
Rolf