Zum Inhalt springen

Upload einer Datei mit PHP


Empfohlene Beiträge

Hallo zusammen,

mein Problem ist nicht so einfach wie es im Titel steht. :)

Ich erstelle insgesamt sieben gleiche Upload-Zeilen

durch eine WHILE-Schleife.

Mit diesen sieben Upload-Zeilen sollte es aber möglich

sein, jedes einzeln hochzuladen.

Hier mal ein Stück Code, wie das bei mir aussieht.


<? echo '<form action="index.php?site=forms&func=art&grpid='.$grpid.'" method="post" enctype="multipart/form-data">'; ?>

			<tr>

				<?

					$i = 1;

					while($i <= 7)

					{						

				?>

				<td valign="top">

					Artikel / <? echo $i; ?><br>

					<br>

					<center><input type="submit" name="update" value="Update"></center>

				</td>

				<td valign="top">

					<?

						$art = mysql_query("SELECT * FROM ".$T_ART." WHERE artid = ".$i." AND grpid = ".$_GET['grpid']);

						$artdat = mysql_fetch_assoc($art);


						if($artdat == false)

						{

							/* Leeren Datensatz einfügen, falls nicht vorhanden */

							mysql_query("INSERT INTO ".$T_ART." (artid, grpid, kurz, lang, bild) VALUES ('$i', '$_GET[grpid]', '', '', '')");


							/* Artikelgruppe Kurzbeschreibung */

							echo '<input type="text" name="akb" value="'.$artdat['kurz'].'" size="54"><br>';


							/* Artikelgruppe Langebeschreibung */

							echo '<textarea cols="40" rows="5" name="alb">'.$artdat['lang'].'</textarea><br>';


							/* Auswahl neues Bild */

							echo '<input type="file" name="bild" size="37"><br>';


							/* Auswahl bestehendes Bild */

							?>

							<select name="bild_exist">

								<option value="">Kein Bild</option><br>

								<?

									$dir = "./images/pics/";

									$handle = opendir($dir);

									while($file = readdir ($handle))

									{

										if($file != "." && $file != "..")

										{

											if(is_dir($dir.$file))

											{

												echo '<option value="'.$file.'">'.$file.'</option>\n';

											}

											else

											{

												echo '<option value="'.$file.'">'.$file.'</option>\n';

											}

										}

									}

									closedir($handle);

								?>

							</select><br>

							<font color="#FF0000"><b>Falls Bild nicht erscheint, bitte "F5" drücken!</b></font>

				</td>

				<td width="300" height="250">				

					<?

							/* Bild */

							if($grpdat['bild'] == "")

							{

								echo 'Kein Bild vorhanden';

							}

							else

							{

								echo '<img src="images/pics/'.$artdat['bild'].'" alt="Bild" >';

							}

					?>

				</td>

					<?

						}

						else

						{

							/* Artikelgruppe Kurzbeschreibung */

							echo '<input type="text" name="akb" value="'.$artdat['kurz'].'" size="54"><br>';


							/* Artikelgruppe Langebeschreibung */

							echo '<textarea cols="40" rows="5" name="alb">'.$artdat['lang'].'</textarea><br>';


							/* Auswahl neues Bild */

							echo '<input type="file" name="bild'.$i.'" size="37"><br>';


							/* Auswahl bestehendes Bild */

							?>

							<select name="bild_exist">

								<option value="">Kein Bild</option><br>

								<?

									$dir = "./images/pics/";

									$handle = opendir($dir);

									while($file = readdir ($handle))

									{

										if($file != "." && $file != "..")

										{

											if(is_dir($dir.$file))

											{

												echo '<option value="">Kein Bild</option>\n';

												echo '<option value="'.$file.'">'.$file.'</option>\n';

											}

											else

											{

												echo '<option value="'.$file.'">'.$file.'</option>\n';

											}

										}

									}

									closedir($handle);

								?>

							</select><br>

							<font color="#FF0000"><b>Falls Bild nicht erscheint, bitte "F5" drücken!</b></font>

				</td>

				<td width="300" height="250">				

					<?

							/* Bild */

							if($artdat['bild'] == "")

							{

								echo 'Kein Bild vorhanden';

							}

							else

							{

								echo '<img src="images/pics/'.$artdat['bild'].'" alt="Bild" >';

							}

						}

					?>

				</td>

			</tr>

			<?

				echo '<input type="hidden" name="ai" value="'.$i.'">';

				$i++;

				echo "\n";

				}

			?>

Hoffe es kann mir jemand helfen.

Gruß

TripleD

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es reicht, wenn Du den INPUT-Feldern z.B. allen den gleichen Array-Namen gibst, Schlüssel sind nicht zwingend erforderlich...z.B.:

<input type="file" name="bild[]">
Diese kannst Du dann über PHP aus dem Array $_FILE entnehmen. Du kannst Dir ja mal am Anfang vom verarbeitenden Script die Inhalte des Arrays anzeigen lassen, dann weisst Du, wie Du es verarbeiten musst...:

echo "<pre>";

print_r($_FILE);

echo "</pre>";

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für deine Hilfe,

aber irgendwie will das ganze nicht so richtig.

Ich hab es jetzt zwar als Array, aber ich komm nicht

drauf, wie ich das Array auslesen kann.

Nochmal den Sachverhalt:

--------------------------

1.0 Formular mit sieben Eingabefeldern (mit WHILE-Schleife realisiert)

2.0 Formularblock:

2.1 <input type="file" name="bild[]">

2.2 <select name="bild_exist[]">

2.3 Ein Textfeld und ein Textarea

3.0 Übergabe an die ausführende Datei


echo "- Bin drin in Artikel<br>";


		echo "<pre>";

		echo "Neues Bild<br>";

		print_r($_FILES["bild"]["name"]);

		echo "</pre>";


		foreach($bild_exist as $key => $bild_exist1)

		{

			echo $key." | ".$bild_exist1."<br>";

			echo "------------------------<br>";

			$bild = $bild_exist1;

		}


		if($bild != "")

		{

			echo "- Beginne Upload<br>";


			$dateipfad="images/pics/";

			$datei=$_FILES["bild"];

			$dateiname=$_FILES["bild"]["name"];

			$dateiuploadname=$_FILES["bild"]["tmp_name"];


			move_uploaded_file($dateiuploadname,$dateipfad.$dateiname);


			$bild = $dateiname;


			echo "- Erfolgreich Upgeloaded<br>";

		}

		else

		{


			echo "- Existierendes Bild verwendet<br>";

		}


		//mysql_query("UPDATE ".$T_ART." SET kurz='$akb', lang='$alb', bild='$bild' WHERE grpid = ".$grpid);

		//header('Location: index.php?site=artikel&grpid='.$grpid);

Hoffe es findet jemand eine Lösung. Ich bin am verzweifeln.

TripleD

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo Monty,

hier mal die Ausgabe:

Vom Input Feld:


Neues Bild


Array

(

    [0] => 

    [1] => 

    [2] => 

    [3] => 

    [4] => 

    [5] => 

    [6] => 

)

Vom SELECT-Feld

Existierendes Bild


Array

(

    [1] => pwd.png

    [2] => 

    [3] => 

    [4] => 

    [5] => 

    [6] => 

    [7] => 

)

Ich hab ja in meinem ausführenden Script eine Abfrage drin,

dass wenn das INPUT leer ist, der Eintrag aus dem SELECT

genommen werden soll.

TripleD

Link zu diesem Kommentar
Auf anderen Seiten teilen

Genau, die obere Ausgabe ist aus dem $_FILE - Array.

Es soll eigentlich mit beiden weitergearbeitet werden.

Je nachdem was ausgewählt wird.

Die ausgewählte Datei aus dem SELECT wird in eine

mySQL-DB eingetragen.

Und die aus dem $_FILE - Array wird hochgeladen und

dann in die DB eingetragen.

Hier mal der FORM-Tag:

<? echo '<form action="index.php?site=forms&func=art&grpid='.$grpid.'" method="post" enctype="multipart/form-data">'; ?>

Link zu diesem Kommentar
Auf anderen Seiten teilen

Have a try...

Parse-Error sind möglich ;)


$dstPath = "/tmp/";

	if (is_Array($_FILES)) {

		foreach ($_FILES as $fkey=>$fval) {		

			if (is_File($fval['tmp_name'])) {

				$dstFName = preg_replace("/[^\._A-Za-z0-9]/is","_",$fval['name']);			

				$dstFPath = realpath($dstPath)."/".$dstFName;


				if (move_uploaded_file($fval['tmp_name'],$dstFPath)) {

					//Datei $fval['name'] wurde hochgeladen und unter $dstFName im Verzeichnis $dstPath gespeichert....

					//Quasi kann hier jetzt Dein Eintrag in die DB erfolgen...


				}							

			}			


		}

	}



	if (is_Array($_POST['bild_exist'])) {

		foreach ($_POST['bild_exist'] as $fkey=>$fval) {

			if (!empty($fval)) {

				//Hier kannst Du jetzt das existierende Bild in die DB schreiben... ($fval)

			}	

		}

	}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi Monty,

erst mal einen ganz großen Dank an dich.

Es funktioniert wunderbar, bis auf eine kleinigkeit.

Das Bild aus dem $_FILE wird nicht hochgeladen und

kann somit auch nicht in die Datenbank eingetragen werden.

Der rest funktioniert aber ohne Probleme.

Danke nochmals für deine Hilfe.

Gruß

TripleD

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hab da nochmal was ausprobiert, und zwar

geht er nicht in folgende Schleife rein.


if (is_File($fval['tmp_name']))

				{

					$dstFName = preg_replace("/[^\._A-Za-z0-9]/is","_",$fval['name']);

					$dstFPath = realpath($dstPath)."/".$dstFName;


					if (move_uploaded_file($fval['tmp_name'],$dstFPath))

					{

						//Datei $fval['name'] wurde hochgeladen und unter $dstFName im Verzeichnis $dstPath gespeichert....

						//Quasi kann hier jetzt Dein Eintrag in die DB erfolgen...

						//mysql_query("UPDATE ".$T_ART." SET kurz='$akb', lang='$alb', bild='$dstFName' WHERE grpid = ".$grpid." AND artid=".$fkey);

						echo "Erfolgreich hochgeladen<br>";

					}

					else

					{

						echo "Fehler beim Upload<br>";

					}

				}

Damit hat sich "print_r($_FILES);" wohl erledigt, oder?

Link zu diesem Kommentar
Auf anderen Seiten teilen

OK, also hier mal die Ausgabe von $_FILES:


Array ( [bild] => Array ( [name] => Array ( [0] => [1] => hide.gif [2] => [3] => [4] => [5] => [6] => ) [type] => Array ( [0] => [1] => image/gif [2] => [3] => [4] => [5] => [6] => ) [tmp_name] => Array ( [0] => [1] => C:\WINDOWS\TEMP\php4C7.tmp [2] => [3] => [4] => [5] => [6] => ) [error] => Array ( [0] => 4 [1] => 0 [2] => 4 [3] => 4 [4] => 4 [5] => 4 [6] => 4 ) [size] => Array ( [0] => 0 [1] => 379 [2] => 0 [3] => 0 [4] => 0 [5] => 0 [6] => 0 ) ) ) 1

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dann nimm das hier für den oberen Bereich... ;)


	if (is_Array($_FILES['bild']['tmp_name'])) {

		foreach ($_FILES['bild']['tmp_name'] as $fkey=>$fval) {		

			if (is_File($fval))) {

				$dstFName = preg_replace("/[^\._A-Za-z0-9]/is","_",$_FILES['bild']['name'][$fkey]);			

				$dstFPath = realpath($dstPath)."/".$dstFName;


				if (move_uploaded_file($fval,$dstFPath)) {

					//Datei $_FILES['bild']['name'][$fkey] wurde hochgeladen und unter $dstFName im Verzeichnis $dstPath gespeichert....

					//Quasi kann hier jetzt Dein Eintrag in die DB erfolgen...


				}							

			}			


		}

	}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Entweder bin ich zu blöd, das ganze bei mir einzubauen, oder es stimmt irgendwas an dem Script nicht.

Fehler im Script:

Es wird die Temp-Datei in die DB geschrieben.

print_r($_FILE) von INPUT:


Array ( [bild] => Array ( [name] => Array ( [0] => hide.gif [1] => [2] => [3] => [4] => [5] => [6] => ) [type] => Array ( [0] => image/gif [1] => [2] => [3] => [4] => [5] => [6] => ) [tmp_name] => Array ( [0] => C:\WINDOWS\TEMP\php583.tmp [1] => [2] => [3] => [4] => [5] => [6] => ) [error] => Array ( [0] => 0 [1] => 4 [2] => 4 [3] => 4 [4] => 4 [5] => 4 [6] => 4 ) [size] => Array ( [0] => 379 [1] => 0 [2] => 0 [3] => 0 [4] => 0 [5] => 0 [6] => 0 ) ) ) 1

print_r($_FILE) von SELECT:

Array ( [bild] => Array ( [name] => Array ( [0] => [1] => [2] => [3] => [4] => [5] => [6] => ) [type] => Array ( [0] => [1] => [2] => [3] => [4] => [5] => [6] => ) [tmp_name] => Array ( [0] => [1] => [2] => [3] => [4] => [5] => [6] => ) [error] => Array ( [0] => 4 [1] => 4 [2] => 4 [3] => 4 [4] => 4 [5] => 4 [6] => 4 ) [size] => Array ( [0] => 0 [1] => 0 [2] => 0 [3] => 0 [4] => 0 [5] => 0 [6] => 0 ) ) ) 11

Und hier noch der Coder der Ausführbaren Datei:

echo print_r($_FILES);

		$dstPath = "/images/pics/";

		if (is_array($_FILES['bild']))

		{

			foreach ($_FILES['bild']['tmp_name'] as $fkey=>$fval)

			{

				if (is_file($fval))

				{

					$dstFName = preg_replace("/[^\._A-Za-z0-9]/is","_",$_FILES['bild']['name'][$fkey]);

					$dstFPath = realpath($dstPath)."/".$dstFName;


					if (move_uploaded_file($fval,$dstFPath))

					{

						//Datei $_FILES['bild']['name'][$fkey] wurde hochgeladen und unter $dstFName im Verzeichnis $dstPath gespeichert....

						//Quasi kann hier jetzt Dein Eintrag in die DB erfolgen...

						mysql_query("UPDATE ".$T_ART." SET kurz='$akb', lang='$alb', bild='$dstFName' WHERE grpid = ".$grpid." AND artid=".$fkey);

					}

				}

			}

		}


		echo print_r($bild_exist);

		if (is_Array($_POST['bild_exist']))

		{

			foreach ($_POST['bild_exist'] as $fkey=>$fval)

			{

				if (!empty($fval))

				{

					//Hier kannst Du jetzt das existierende Bild in die DB schreiben... ($fval)

					mysql_query("UPDATE ".$T_ART." SET kurz='$akb', lang='$alb', bild='$fval' WHERE grpid = ".$grpid." AND artid=".$fkey);

				}

			}

		}


		header('Location: index.php?site=artikel&grpid='.$grpid);

Danke für deine Hilfe

TripleD

Link zu diesem Kommentar
Auf anderen Seiten teilen

if (is_array($_FILES['bild']))

{

Zunächst mal der Vollständigkeit halber:


		if (is_array($_FILES['bild']['tmp_name']))

		{

Ich sehe keinen Fehler in meinem Code, vielleicht sieht ihn jemand anderes.

Du kannst Dir doch einfach mal die Variablen, die ich verwende ausgeben lassen...

Vielleicht ist da ja irgendwo der Fehler ($destFName, $destFPath, $fval, ...)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Problem mit dem Dateinamen in der Datenbank hab ich behoben,

hab ne falsche Variable eingetragen.

Nur das mit dem Datei-Upload will noch nicht.

Ich hab mir jetzt mal den Inhalt der Variablen anzeigen lassen,

das ist der Inhalt:


- dstPath: /images/pics/

- dstFName: hide.gif

- FILES['bild']['tmp_name']: Array

- FILES['bild']['name']: Array

- fkey: 1

- fval: C:\WINDOWS\TEMP\php72E.tmp

Kann es sein das es Problem mit $FILES und fval gibt?

Muss man da noch irgendetwas umschreiben?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich vermute eher, das Problem liegt daran, dass $destPath absolute Linux-Pfade enthält...

Aber da das Script anscheinend auf nem Windows-Server läuft, würde ich es mal mit $destPath = "C:\\verz\unterverz\\.." versuchen oder relative Pfade benutzen...

Gegebenenfalls musst Du den ."/". in der Nähe von realpath() auch noch durch ein ."\\". ersetzen...

Lass Dir deswegen auch mal die Ausgabe von realpath($destPath) anzeigen...

Link zu diesem Kommentar
Auf anderen Seiten teilen

So, jetzt hab ich das Problem gelöst.

War eigentlich ganz easy.

Es lag an folgender Zeile:


$dstFName = preg_replace("/[^\._A-Za-z0-9]/is","_",$_FILES['bild']['name'][$fkey]);

Diese hab ich in folgende Zeile geändert:

$dstFName = $_FILES['bild']['name'][$fkey]);

Nochmal danke für deine Hilfe.

Wünsch dir noch nen schönen Tag.

Gruß

TripleD

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...