Internet Explorer 7 und der Datei-Upload

garnul

Grünschnabel
Hallo Leute,

ich hoffe, das Thema gibt es noch nicht, habe die Suche benutzt und nichts gefunden und die Tipps bei dem Upload-Thread der im FaQ zu finden ist, hilft mir auch nichts weiter :(

Ich habe jetzt ein kleines Script, das es dem Benutzer ermöglicht, Bilder auf den Webserver hochzuladen. Fakt ist: Im Firefox geht alles ohne Probleme.

Hier mal der Code vom Formular:
PHP:
<form enctype="multipart/form-data" action="index.php?page=UpdateMyPicture" method="post" id="form">
	<input name="datei" type="file">
	<input type="submit" value="Datei hochladen" name="uploadpicture">
</form>

Und so siehts beim UploadScript aus (auf das Wichtigste reduziert):
PHP:
if (isset($_POST['uploadpicture']))
{
	$uploaddir = 'img';
	if (isset($_FILES['datei']['name']))
	{
		if (move_uploaded_file($_FILES['datei']['tmp_name'], "$uploaddir/$dateiname"))
		{
			<--- Include einer Seite, die beim Erfolg angezeigt wird --->
		}
		else{ <--- Include einer Seite, die eine Fehlerbeschreibung enthält --->}
	}
}
else
{
	<--- HIER SPRINGT DER IE IMMER HIN --->
}
(Notizen: $dateiname wird im Script vorher noch erzeugt, das ist aber nicht von Bedeutung. Natürlich überprüfe ich auch den Dateitypen, das habe ich rausgeschnitten, ich denke das ist hier nicht wichtig. Wie gesagt, im Firefox 3 geht alles einwandfrei!)

Wenn ich im IE7 $_FILES['datei']['name'] oder $_FILES['datei']['tmp_name'] mit echo ausgebe, gibt er mir nichts zurück. Bei echo von $_POST['datei'].",".$_POST['tmp_name'] steht immerhin der Pfad zu dem Bild auf der Maschine des Uploaders drin... Hab ich mir gedacht na gut nimmste halt das Script und tauscht das if (isset($_FILES['datei']['name'])) mit if (isset($_POST['datei'].$_POST['tmp_name'])) aus (ok, ich habs vorher in eine Variable schreiben lassen, weils mir so lieber ist). Allerdings kein Erfolg, das Script kommt kein bisschen weiter.
Ich bin echt am Verzweifeln, im Internet habe ich nichts gefunden, hier hab ich nichts gefunden und ich war ganz geschockt als heute ein IE User meinte, der Bilderupload geht nicht ... (zum Glück noch in der Testphase).

Ich hoffe ihr könnt mir helfen, ich bin absolut ratlos...

Ich danke schonmal im Vorraus,

Grüße

garnul
 
am besten nutzt du:
Code:
application/x-www-form-urlencoded

damit sollte es gehen, das nutze ich immer, hatte noch nie ein problem damit.

und noch was:

PHP:
$_FILES['datei']

datei muss den gelichen namen haben wie das Formular feld haben:
Sprich:
PHP:
$_FILES['uploadpicture']
 
Zuletzt bearbeitet:
Moin garnul,

ich reduziere dein Skript mal noch mehr aufs Wesentliche :-)
Code:
if (isset($_POST['uploadpicture']))
{
    
}
else
{
    <--- HIER SPRINGT DER IE IMMER HIN --->
}

Wenn es an dem ist, würde das bedeuten, dass $_POST['uploadpicture'] nicht übermittelt wird. Die einzig logische Erklärung dafür wäre, dass das Formular nicht über einen Klick auf den Submit-Button gesendet wurde(der IE übermittelt solche Buttons nur, wenn sie geklickt wurden, FF immer).

Poste mal besser doch das komplette Skript, vielleicht gibt es noch andere Fehlerquellen(auch die Prüfung des Dateityps ist da erfahrunggsgemäss ein üblicher Verdächtiger)
 
Hallo,

erstmal danke für Eure Antworten :))

===

am besten nutzt du:
Code:
application/x-www-form-urlencoded

damit sollte es gehen, das nutze ich immer, hatte noch nie ein problem damit.

und noch was:

PHP:
$_FILES['datei']

datei muss den gelichen namen haben wie das Formular feld haben:
Sprich:
PHP:
$_FILES['uploadpicture']

Wenn ich
Code:
application/x-www-form-urlencoded
benutze, dann kommt der Firefox genausoweit wie der IE7 und der IE7 kein Stück weiter ^^ und wenn ich
PHP:
$_FILES['uploadpicture']
nehme, dann gebe ich ja die Beschriftung vom Upload-Button aus (hab ich auch getestet, dem ist so ^^). Oder sollte ich das Formular, also im <form> Tag schon benennen?

@ Sven Mintel:
Hier mal der ganze Code, nicht lachen wegen den Überprüfungen, das Provisorium wird noch ausgetauscht ^^:
PHP:
if (isset($_POST['uploadpicture']))
{
	$uploaddir = 'img';
	if (isset($_FILES['datei']['name']))
	{
		$checkext = substr($_FILES['datei']['name'], -3); $checktext = strtolower($checktext);
		if($checkext == "jpg" OR $checkext == "gif" OR $checkext == "png")
		{
			$checksize = getimagesize($_FILES['datei']['tmp_name']);
			if($checksize[0] <= "350" OR $checksize[1] <= "350")
			{
				if($currentpicture != "nouserpic.jpg")
				{
					$dateiname= "img/"; $dateiname .= $currentpicture;
					if(file_exists("$dateiname")){unlink($dateiname);}
				}
				else
				{
					$dateiname = $_SESSION['userid'];
					$dateiname .= $_SESSION['username'];
					$dateiname .= substr($_FILES['datei']['name'], -4);	
					if (move_uploaded_file($_FILES['datei']['tmp_name'], "$uploaddir/$dateiname"))
					{
						$sql = "UPDATE $tUser SET picture = '$dateiname' WHERE id LIKE $criteria";
						$user_query = mysql_query($sql) or die("Anfrage nicht erfolgreich");
						include("templates/user/updatepicture/messages/pictureuploaded.php");
					}
				}
			}
			else{include("templates/user/updatepicture/messages/toobig.php");}
	  }
	  else{include("templates/user/updatepicture/messages/othererrors.php");}
	}
	else
	{
		echo $_POST['datei'].",".$_POST['tmp_name'];
	}
}
Zum Code soviel:
$uploaddir existiert mit 100%iger Sicherheit
$currentpicture wird mit einer Abfrage aus der Datenbank gefüllt
$dateiname wird eben mit dem Pfad und dem derzeitigen Bentuzerbildnamen gefüllt um dies zu löschen (ist so gewollt)
Um den neuen Dateinamen zu basteln hole ich mir aus der Session die User-ID und den User-Namen sind auch gefüllt
Wie zu sehen ist wird beim Erfolg auch in die Datenbank der neue Name des Bildes geschrieben.
pictureuploaded.php wird includiert wenn es erfolgreich war, toobig.php wird includiert wenn es beim Prüfen der Pixelanzahl durchgefallen ist und bei othererrors.php werden eben andre Fehler ausgegeben (ist bis dato aber noch nie aufgetreten).
Nunja und das echo $_POST['datei'].",".$_POST['tmp_name']; war ein Test von mir, was für ein Wert drinsteht, wenn der IE7 es kläglich versucht, also an der Stelle macht der IE immer weiter.

Danke sehr

Schönen Tag wünsche ich

Grüße,

garnul
 
Bei mir ist der code so Funktionstüchtig:

PHP:
		if ($EingabeArtNr!="" && !empty($Eingabebildgross)) {
	if (is_uploaded_file($Eingabebildgross)) {
	$target_path = "/home/www/".$username."/html/produktbilder/";
$time = time();
	$target_path2 = $target_path .$time. basename( $_FILES['Eingabebildgross']['name']);

	if(move_uploaded_file($_FILES['Eingabebildgross']['tmp_name'], $target_path2)) {
 	   
 	   
 	   
 $PicPathIn=$target_path;
$PicPathOut=$target_path;

// Orginalbild
$bild=$time.basename($_FILES['Eingabebildgross']['name']);

// Bilddaten ermitteln
$size= GetImageSize("$PicPathIn"."$bild");
$breite=$size[0];
$hoehe=$size[1];
$neueBreite=220;
$neueHoehe= intval($hoehe*$neueBreite/$breite);

if($size[2]==1) {
// GIF
$altesBild= imagecreatefromgif("$PicPathIn"."$bild");
$neuesBild= imagecreate($neueBreite,$neueHoehe);
 imageCopyResized($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe);
 imageGIF($neuesBild,"$PicPathOut"."TN"."$bild");
}

if($size[2]==2) {
// JPG
$altesBild= ImageCreateFromJPEG("$PicPathIn"."$bild");
$neuesBild= imagecreate($neueBreite,$neueHoehe);
 imageCopyResized($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe);
 ImageJPEG($neuesBild,"$PicPathOut"."TN"."$bild");
}

if($size[2]==3) {
// PNG
$altesBild= ImageCreateFromPNG("$PicPathIn"."$bild");
$neuesBild= imagecreate($neueBreite,$neueHoehe);
 imageCopyResized($neuesBild,$altesBild,0,0,0,0,$neueBreite,$neueHoehe,$breite,$hoehe);
 ImagePNG($neuesBild,"$PicPathOut"."TN"."$bild");
}
$dateinameklein= "TN".$bild;
$dateinamegross= $bild;
echo "Altes Bild:<BR>";
echo "<IMG SRC=\"../../produktbilder/$bild\" WIDTH=\"$breite\" HEIGHT=\"$hoehe\"><BR><BR>";
echo "Neues Bild:<BR>";
$Thumbnail="../../produktbilder/"."TN".$bild;
echo "<IMG SRC=\"$Thumbnail\" WIDTH=\"$neueBreite\" HEIGHT=\"$neueHoehe\">"; 

 	   
	} else{
    echo "There was an error uploading the file, please try again!";
	echo "$target_path";
	}
}
else { print "<p>Uploadfehler.</p>"; } ....

Code:
<input type="File" class="form" name="Eingabebildgross"  size="21" maxlength="60">

das ist in meiner HTML ...

multipart/form-data und method post, funktionieren auch, x-urlencode... muss es nicht sein, funktioniert bei mir aber auch.
 
Oh mein Gott! Bin grad durch Zufall auf etwas gestoßen.

Ich habe nicht nur dieses eine Formular auf der Seite, sondern noch eins darüber, ein simpler Button.

Zum experimentieren habe ich mein bestehendes Uploadscript genommen und ein eine externe Datei gepfeffert mit dem Formular und als action eben PHP_SELF. Siehe da, es geht sogar im IE! Ich war verblüfft, das Problem gelöst zu haben, ohne auch nur irgendwas zu machen. Dachte ich mir gut, dann probierst du das mal bei deinem System live. Direkt unter dem Formular zum Test den PHP Code rein. Firefox - einwandfrei. IE: Nichts passiert, er schießt mich trotzdem noch auf die UpdateMyPicture, also die Action, die vorher ausgeführt wurde. Da dachte ich mir, da dies sogar nach dem Löschen des Caches weiter aufgetreten ist, das gibt es doch nicht. Dann entferne ich testweise den Button, der vor dem Upload-Formular kommt und siehe da - es geht?
Kommt der IE nur mit einem Formular pro Seite zurecht oder wie kann das sein? Oder mache ich irgendwas falsch?

Also, die Formulare sind in sich abgeschlossen, jedes beginnt mit einem <form> und endet mit einem </form>, aber er nimmt wohl immer die Action vom ersten form!

Kann man das umgehen?

@PowerCheat: Danke, sehr nett, dass du mir dein Script zur Verfügung gestellt hättest, aber ich hoffe, ich habe die Lösung meines Problems gefunden ^^ sollte dem nicht so sein, kann ich dann auf dich zurückkommen?

Grüße,

ein verwirrter garnul

Nachtrag: So, hab jetzt die Gewissheit. Wenn das erste Formular weg ist, gehts. Nur ist im ersten Formular eben nur ein simpler Button der in der UpdateMyPicture auch mit einem isset abgefangen wird und dann halt was in der Datenbank umschreibt. Für dieses Formular habe ich:
HTML:
<form action="index.php?page=UpdateMyPicture" method="post" id="form">

Ich möchte den Button aber ungerne zu dem Upload-Formular dazugesellen, weil der ja eigentlich keine Datei verschickt und ich mich rein vom Gefühl her dann bei einem einfachen Button nicht mit einem

HTML:
<form enctype="multipart/form-data" action="index.php?page=UpdateMyPicture" method="post" id="form">

anfreunden kann, oder ist das egal?
 
Zuletzt bearbeitet:
Zeige mal bitte den HTML-Code des Dokumentes mit beiden Formularen, ich mag nicht glauben, dass der IE das einfach so macht :suspekt:
 
So, hier mal der HTML Code (nur die beiden Formulare, der rest ist nur Geplänkel):

HTML:
<table cellpadding="2" cellspacing="0" border="0" width="100%">
	<tr>
		<td>
			<form action="index.php?page=UpdateMyPicture" method="post" id="form">
				<input type="submit" value="Bild löschen" name="deletepicture"?>
			</form>
			
			<hr>
			
			Maximale Größe: 350 x 350 Pixel<br>
			Erlaubte Formate: *.jpg, *.gif, *.png
			<form enctype="multipart/form-data" action="index.php?page=UpdateMyPicture" method="post" id="form">
				<input name="datei" type="file">
				<input type="submit" value="Datei hochladen" name="uploadpicture">
			</form>
		</td>
	</tr>
</table>
 
Was hat es damit auf sich:
Code:
<input type="submit" value="Bild löschen" name="deletepicture"?>

Zeige mal das ganze Geplänkel...so wie es im Browser unter "Quelltext" steht.
 
Was hat es damit auf sich:
Code:
<input type="submit" value="Bild löschen" name="deletepicture"?>

Zeige mal das ganze Geplänkel...so wie es im Browser unter "Quelltext" steht.


Hallo Sven,

das Fragezeichen habe ich vergessen zu löschen, normal war da noch ein kleiner PHP Code drin, der eine Variable auf einen bestimmten Wert abgeklopft hat, komplett sähe das so aus:

HTML:
<input type="submit" value="Bild löschen" name="deletepicture"<? if ($usr['picture'] == "nouserpic.jpg"){echo "disabled";} ?>

Hab das PHP-Schnipselchen aber entfernt da ich den Code übersichtlich für euch halten wollte, da ist mir das Fragezeichen durchgerutscht :-(

Grüße,

garnul

Nachtrag: Huch zu schnell auf abschicken gedrückt ^^.
Grad wollt ich noch einstellen, wies der Browser sieht im Quelltext (danke dir für den heißen Tipp) und bin auf Folgendes gestoßen:

Durch das PHP im input habe ich ein ">" vergessen und ein Leerzeichen war zuwenig (zwischen name="" und disabled, sah so aus: name="blabla"disabled), probiere grad ob es das war, aber das wars höchstwarscheinlich... ^^"""

Nachtrag 2: Das wars... verzeiht mir :( danke für eure Mühen, auch wenn ich euch wegen nichts und wieder nichts gefordert habe... da war die Fehlertoleranz des Firefoxes wohl mein größtes Problem ^^"

Wieder was gelernt, immer nen Blick in den Quelltexteditor von FF werfen, war eh schön rot makiert, man bin ich blöd ^^
 
Zuletzt bearbeitet:
Zurück