Eingabe von Dateifeld überprüfen
Mr.Hankey
- javascript
0 Ed X0 Mr.Hankey0 Sven Rautenberg0 Ed X
moin
ich will eine Überprüfung von einem Dateifeld machen mit Javascript. Und zwar soll direkt abgefragt welche Endung die Datei hat.
Das Feld:
<input type="file" size="50" name="screen1" accept="*.jpg">
Die Überprüfung:
if (document.Forumlar.screen1.value != "")
{
path = document.Forumlar.screen1.value;
searchtype = path.search(/jpg$/);
if(searchtype != -1){
alert("Bild ist jpeg");
return false;
}
}
Das ganze ist Inhalt von ner Funktion die mir alle Fomulareingaben überprüft.
Es wird mir kein Javascript-Fehler ausgegeben und das liegt so wie es aussieht daran das es die Eigenschaft value nicht gibt, obwohl es die laut Doku geben sollte. Kann das sein?
Hi,
moin
?? du solltest deinen Tagesrhythmus überarbeiten :)
Das Feld:
<input type="file" size="50" name="screen1" accept="*.jpg">
.......................................................^^^^^^
Du fragst eine Wildcard ab keinen Mimetype!!!
das sollte heißen: image/jpeg, mal abgesehen davon dass es sowieso
nicht funktioniert :( d.h. auf server seite nochmal testen!!!
Die Überprüfung:
if (document.Forumlar.screen1.value != "")
{
path = document.Forumlar.screen1.value;
das ist der inhalt eine function, brauchst du path nochmal? Ich denke
nein! also var path =
searchtype = path.search(/jpg$/);
wieso fragst du mit .search, match ist hier viel besser!!!!
außerdem gibt es selbst auf windows systemen .jpeg dateien, die alle
gültige jpegs sind
if(searchtype != -1){
alert("Bild ist jpeg");
also erst sagst "erfolg" und dann ....
return false;
... verweigerst du die rückgabe???
return true;
}
hier mustt du mit else arbeiten
else
return false;
}
Schau dir bitte mal folgendes script an:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 //EN">
<html>
<head>
<title>Untitled</title>
<script>
function isJpg(inp)
{
if (inp != "") {
var check = inp.split(".");
if ((check[1] == "jpg") || (check[1] == "jpeg")){
alert("Bild ist jpeg");
return true;}
else
return false;
}
}
</script>
</head>
<body>
<form action="" enctype="multipart/form-data" name="a1" id="a1">
<input type="file" name="pic" size="50">
<input type="button" value="testen" onclick="isJpg(document.a1.pic.value)">
</form>
</body>
</html>
versuch es zu verstehen. Ansonsten frag nochmal
Bye Ed X
Supi danke ich teste es gleich mal aus. Sorry ich hatte die Sachen einfach aus meinem kompletten Script rauskopiert deshalb sind einige Sachen für dich nicht so durchsichtig
Danke
Mr.Hankey
Schau dir bitte mal folgendes script an:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 //EN">
<html>
<head>
<title>Untitled</title>
<script>
function isJpg(inp)
{
if (inp != "") {
var check = inp.split(".");
An dieser Stelle gehst du davon aus, daß der Dateipfad nur einen Punkt enthält, der die Dateiendung trennt. Leider lassen die meisten Systeme, für die es Browser gibt, auch Punkte im Pfadnamen zu, so daß dann die nachfolgende Bedingung nicht mehr zutreffen kann.
Besser wäre:
var check = inp.substring(inp.lastIndexOf(".")+1,inp.length)
(PS: Ist ein Schnellschuß, ggf. sind da noch +1 oder -1 zu rechnen, daß hab ich jetzt nicht geprüft.)
Und hier dann natürlich mit check vergleichen, nicht mit check[1].
if ((check[1] == "jpg") || (check[1] == "jpeg")){
Andere Alternative: Mit check[check.length-1] vergleichen, das enthält das letze Element von split.
alert("Bild ist jpeg");
return true;}
else
return false;
}
}
</script>
</head>
- Sven Rautenberg
Hi Sven,
if (inp != "") {
var check = inp.split(".");
An dieser Stelle gehst du davon aus, daß der Dateipfad nur einen Punkt enthält, der die Dateiendung trennt. Leider lassen die meisten Systeme, für die es Browser gibt, auch Punkte im Pfadnamen zu, so daß dann die nachfolgende Bedingung nicht mehr zutreffen kann.
Genau das war der sinn, nur habe ich dass nicht weiter erklärt.
Denn somit kann ich ausschließen, dass mehrere punkte im dateinamen
enthalten sind und dann evtl. auf dem server Ärger stiften.
Man könnte die routine noch ausweiten und den user informieren, was da
im argen liegt. Ich könnte =~ s/.*/sollte/ noch auf weitere dinge
prüfen, die ich nicht mag. So da wären alle charCodes die nicht
zwischen 48-57 || 65-90 || 97-122 || 95 liegen. Ein beliebter kandidat ist auch der hier /\s/
Nun ja, kann man auch alles auf dem server testen, aber das ist seine sache. Ich bin nun mal fan von clientseitiger verarbeitung. hat der user
fuer seine rechenleistung gezahlt, soll er sie auch nutzen :)
Bye Ed X
Hi, Ed X!
An dieser Stelle gehst du davon aus, daß der Dateipfad nur einen Punkt enthält, der die Dateiendung trennt. Leider lassen die meisten Systeme, für die es Browser gibt, auch Punkte im Pfadnamen zu, so daß dann die nachfolgende Bedingung nicht mehr zutreffen kann.
Genau das war der sinn, nur habe ich dass nicht weiter erklärt.
Denn somit kann ich ausschließen, dass mehrere punkte im dateinamen
enthalten sind und dann evtl. auf dem server Ärger stiften.
Ich mach' mal ein konkretes Beispiel, damit der geneigte Leser auch was davon hat:
Eine Datei im Linux-Dateisystem kann ohne Probleme in diesem Pfad liegen:
"/home/sven/homepage/v1.0/bilder/titel.de.jpg"
Mit deiner Version wird folgendes in check[1] drinstehen: "0/bilder/titel", check[2] enthält "de", und check[3] enthält "jpg".
Dabei ist das eine ganz reguläre Datei, die ich vielleicht hochladen wollte: Eben eine aus meiner ersten Version der Homepage, eine Titelgrafik des deutschen Titels. Daran ist nichts bösartiges zu erkennen. Mit deinem suboptimalen Test würdest du die Datei nicht als zulässiges JPEG abwehren - und das nur, weil dein Server möglicherweise Probleme mit zuvielen Punkten im Dateinamen hat?
Es ist Aufgabe des Servers, die Datei entgegenzunehmen. Der Dateiname, unter dem sie dort gespeichert wird, ist NICHT vorgeschrieben. Wenn der Server also Probleme mit gewissen Dateinamen hat (weil er z.B. unter MSDOS läuft und nur 8.3-Dateinamen verarbeiten kann), dann hat der Server dafür zu sorgen, daß der Dateiname entsprechend gewandelt wird.
Man könnte die routine noch ausweiten und den user informieren, was da
im argen liegt. Ich könnte =~ s/.*/sollte/ noch auf weitere dinge
prüfen, die ich nicht mag. So da wären alle charCodes die nicht
zwischen 48-57 || 65-90 || 97-122 || 95 liegen. Ein beliebter kandidat ist auch der hier /\s/
Woher soll der User wissen, welches Betriebssystem der Server verwendet, und welche Dateinamenskonventionen dort herrschen? Wenn der User es geschafft hat, irgendwie ungültige Zeichen in den Dateinamen zu bringen, die auf seinem System aber gültig sind, ist es ganz allein Serversache, das für seinen Herrschaftsbereich zu ändern.
Nun ja, kann man auch alles auf dem server testen, aber das ist seine sache. Ich bin nun mal fan von clientseitiger verarbeitung. hat der user
fuer seine rechenleistung gezahlt, soll er sie auch nutzen :)
Wenn du den User zwingst, erstmal einen Dateimanager anzuwerfen, um den Dateinamen (der möglicherweise woanders noch so gebraucht wird) für den Upload extra zu ändern, wird der dir was husten. Ich würde das zumindest tun. Spart aber dann Speicherplatz auf dem Server. <eg>
Bye Ed X
Gute Nacht auch! <blickaufuhr>
- Sven Rautenberg
Joho,
Dabei ist das eine ganz reguläre Datei, die ich vielleicht hochladen wollte: Eben eine
aus meiner ersten Version der Homepage, eine Titelgrafik des deutschen Titels. Daran ist
nichts bösartiges zu erkennen. Mit deinem suboptimalen Test würdest du die Datei nicht
als zulässiges JPEG abwehren - und das nur, weil dein Server möglicherweise Probleme mit
zuvielen Punkten im Dateinamen hat?
Ausserdem, warum sollte eine JPEG-File unbedingt die Endung .jpg haben? Diese Suffixe kommen
aus der Windows-Welt: es ist hier gar nix vorgeschrieben. Die Datei kann genau so gut
bild.lalajetztschreibichmirhiernenwolfaberichbingeradesolustig
heissen.
Gruss,
CK
http://wwwtech.de
Hallihallo,
Versuch einer Rechtfertigung,
Es ist natürlich nicht auszuschließen, dass ein solcher String mehr
als einen Punkt beinhaltet, auch unter Windows. Ma denke nur an die
berühmten ~PST.TMP Ordner oder wie sie alle heißen. Somit würde das
Skript auch auf einem M$ System scheitern. Dennoch würde ich prognostizieren, dass das Skript in weit mehr als 90% der Fälle klaglos funktioniert.
Letztendlich ist das eigentliche Problem, nämlich die Festellung des
MimeTypes, unter JavaScript gar nicht und serverseitig auch nicht
befriedigend zu lösen.
Noch haben wir keine MIMEType-implementierenden Filesysteme :(
Bliebe aber eines zu bedenken: Die hochgeladenen Datein müssen auf dem
Server auch gehandhabt werden. Klare Formate machen sich gut bei der
Automatisierung von Prozessen, weshalb ich hier die einpunktvariante
mit eindeutigem *.jpeg Suffix bevorzugen würde. Den Dateiname beim
Eintreffen schlußendlich in ein gut lesbares Format zu mappen, ist sicherlich die Sache des Serverskripts.
OK. Asche auf mein haupt, dass ich den User etwas schwitzen lassen
wollte. Aber ich bleibe bei meiner >90%-These :)
Also Svens Skript ist sicherlich besser, meins war aber auch blos aus
der hohlen Hand. Und ob ein oder 2 Punkte was soll's. Wichtiger ist da
wohl der test auf Leerzeichen und Konsorten.
"Kopie von irgendwas.jpeg" macht sicher mehr Ärger als "irgenwas.copy.jpeg"
bild.lalajetztschreibichmirhiernenwolfaberichbingeradesolustig
Das mag ja gültig sein, ich würde es aber trotzdem ablehnen auf meinem
Server.
Bye Ed X