Datei-Upload macht Probleme

J1M1

Erfahrenes Mitglied
Tag!

Ich sitze an einem Upload-Skript:


PHP:
if (@copy($file, "$username/$file_name")){
echo "Foto-Upload erfolgreich durchgeführt!";
?>
<br>
<table cellspacing="15">
<tr>
<td><a href="photo_admin.php">Zurück zur Administratoroberfläche</a></td>
<td><a href="/gallery/photo_view.php">Zurück zur Albenübersicht</a></td>
<td><a href="photo_upload_form.php">Noch ein Photo hochladen</a></td>
</tr>
</table>
<?php
}
else {
echo "Datei konnte nicht hochgeladen werden! <a href=photo_upload_form.php>Zurück zum Upload-Formular</a>";
}

Nun, mein Skript führt aber immer den else{}-Teil aus. Warum?
Die Syntax von copy() stimmt doch oder?
Das Holen der Formulardaten ist schon richtig. Habe es durch Ausgaben und so schon gecheckt.

Und mein Webspace erlaubt Datei-Uploads, hab das auch schon geprüft. Und chmod777 für den Ordner habe ich auch schon durchgeführt.


MfG J!M!
 
Es duerfte wohl an einer der 3 Variablen liegen die Du bei copy() einsetzt.
Weiterhin wuerde ich dazu raten bei Uploads mit move_uploaded_file() anstelle von copy() zu arbeiten.
 
Ob die Parameterangaben der copy()-Funktion stimmen, lässt sich am einfachsten im PHP-Handbuch nachlesen. Welchen Wert besitzt denn die $file-Variable? Gibt es eine Fehlermeldung, wenn der Fehlerkontrolloperator weggelassen wird? Probier es auch mal mit der move_uploaded_file()-Funktion, falls die Datei nicht unbedingt kopiert werden muss, sondern ein Verschieben auch möglich ist.
 
Gibt es eine Fehlermeldung, wenn der Fehlerkontrolloperator weggelassen wird?

Gar keine...

Weiterhin wuerde ich dazu raten bei Uploads mit move_uploaded_file() anstelle von copy() zu arbeiten.

Geht auch nicht...

Ob die Parameterangaben der copy()-Funktion stimmen, lässt sich am einfachsten im PHP-Handbuch nachlesen.

Sie stimmen...

Welchen Wert besitzt denn die $file-Variable?
Es duerfte wohl an einer der 3 Variablen liegen die Du bei copy() einsetzt.

Um diese beiden Fragen zu beantworten poste ich mal das ganze Skript
PHP:
/*Das Formularfeld:<input type="file" name="file">*/
$file = $_POST['file'];
$submit = $_POST['submit'];

if ($submit == "Hochladen"){
$data_name = explode(".", $file_name);
$data_name_size = count($data_name);
$data_ext = $data_name[$data_name_size-1]; 
$data_ext = strtolower($data_ext);

echo $file_error;

if (($file_size>0 && $file_size<1048576) && ($data_ext=="gif" || $data_ext=="jpg" || $data_ext=="bmp" || $data_ext=="jpeg")){
if (@move_uploaded_file($file, "$username/$file_name")){
echo "Foto-Upload erfolgreich durchgeführt!";
?>
<br>
<table cellspacing="15">
<tr>
<td><a href="photo_admin.php">Zurück zur Administratoroberfläche</a></td>
<td><a href="/gallery/photo_view.php">Zurück zur Albenübersicht</a></td>
<td><a href="photo_upload_form.php">Noch ein Photo hochladen</a></td>
</tr>
</table>
<?php
}
else {
echo "Datei konnte nicht hochgeladen werden! <a href=photo_upload_form.php>Zurück zum Upload-Formular</a>";
}  
}
else{
echo "Datei nicht vorhanden '\n' oder keine Bild-Datei (jpeg, bmp, gif) <a href=photo_upload_form.php>Zurück zum Upload-Formular</a>";
}
}

Für jeden Benutzer habe ich ein Ordner mit dessen USernamen angelegt, deswegen ist "$username" ein Teil der URL. "$username" habe ich vorher natürlich aus den Session-Daten geholt.

MfG J!M!
 
Erhöhe erst einmal die Fehlersensibilität PHPs:
PHP:
<?php

	ini_set('display_errors', 1);
	ini_set('error_reporting', E_ALL);

	…

?>
Diese Einstellung solltest du übrigens immer haben.

Hast du schon das Kapitel über die Steuerung von Dateiuploads studiert? Dort steht gut beschrieben, wie auf die Daten der hochgeladene Dateien zugegriffen wird und wie die Dateien selbst verarbeitet werden.
 
<?php
ini_set('display_errors', 1);
ini_set('error_reporting', E_ALL);
?>


"Warning: ini_set() has been disabled for security reasons in /*/error.php on line 3

Warning: ini_set() has been disabled for security reasons in /*/error.php on line 4"

So viel dazu... ;-)

Und dieses Thema habe ich bereits, und nicht nur auf PHP-Manual, studiert.


Findest du irgendwo ein Fehler in meinem Skript?

MfG J!M!
 
Falsch ist:
PHP:
$file = $_POST['file'];

Richtig ist:
PHP:
$file = $_FILES['file'];
 
Auch mit $_FILES funktioniert es nicht.:

PHP:
//Holen der Daten
$file = $_FILES['file'];
$submit = $_POST['submit'];

//Wenn auf Formularbutton gedrückt wurde...
if ($submit == "Hochladen"){

//Extrahieren der Dateiendung
$data_name = explode(".", $file_name);
$data_name_size = count($data_name);
$data_ext = $data_name[$data_name_size-1]; 

//Kleinbuchstaben
$data_ext = strtolower($data_ext);

// Nr.1
if (($file_size>0 && $file_size<1048576) && ($data_ext=="gif" || $data_ext=="jpg" || $data_ext=="bmp" || $data_ext=="jpeg")){
// Nr.2
if (@move_uploaded_file($file, "/usr/export/www/vhosts/funnetwork/hosting/*/$username/$file_name")){
//Wenn Hochladen erfolgreich...
//Ausgabe
echo "Foto-Upload erfolgreich durchgeführt!";
?>
<br>
<table cellspacing="15">
<tr>
<td><a href="photo_admin.php">Zurück zur Administratoroberfläche</a></td>
<td><a href="/gallery/photo_view.php">Zurück zur Albenübersicht</a></td>
<td><a href="photo_upload_form.php">Noch ein Photo hochladen</a></td>
</tr>
</table>
<?php
//Schreiben des Namens des neu hochgeladenen Fotos
$dateiname = "photo.txt";
$datei=fopen($dateiname, "r");
$x = 0;
$saved = array();
while(!feof($datei)) {
      $x++;
      $saved[$x] = fgets($datei, 1024);
      }
fclose($datei);

$saved = array_push($saved, $file_name);

$datei=fopen($dateiname, "w");
  for ($i=1;$i <= $x; $i++) {
                fwrite($datei, "$saved[$i]");
      }			
fclose($datei);
			
//End
}
// Nr.2
else {
echo "Datei konnte nicht hochgeladen werden! <a href=photo_upload_form.php>Zurück zum Upload-Formular</a>";
}  
}
// Nr.1
else{
echo "Datei nicht vorhanden '\n' oder keine Bild-Datei (jpeg, bmp, gif) <a href=photo_upload_form.php>Zurück zum Upload-Formular</a>";
}
}

Nicht mal, obwohl ich den ganzen Verzeichnispfad vom Webspaceanbieter angegeben habe.
Auch ohne den LANGEN Verzeichnispfad funktioniert der Datei-Upload nicht.

MfG J!M!
 
Und dieses Thema habe ich bereits, und nicht nur auf PHP-Manual, studiert.
Auch mit $_FILES funktioniert es nicht.
Dann sollte dir aber auch klar sein, dass der Vorschlag Mauris ebenfalls falsch ist, denn die $_FILES-Variable ist ein Array.

Probier mal Folgendes:
PHP:
<?php

	$_notes = array(
		'notice' => array(),
		'error'  => array()
	);



	$prefix = 'copy_of_';
	$_upload_max_filesize = 1048576;
	$destination = '/usr/export/www/vhosts/funnetwork/hosting/*/'.$username.'/';


	if( isset($_POST['submit']) && isset($_FILES['file']) ) {

		// Prüfung auf von PHP festgestellte Fehler beim Hochladen
		if( $_FILES['datei']['size'] > $_upload_max_filesize ) {
			$_FILES['datei']['error'] = UPLOAD_ERR_INI_SIZE;
		}
		switch( $_FILES['datei']['error'] ) {
			case UPLOAD_ERR_INI_SIZE:
			case UPLOAD_ERR_FORM_SIZE:
				$_notes['error'][] = 'Die hochgeladene Datei überschreitet die erlaubte Dateigröße von '.$_upload_max_filesize.' Byte.';
				break;
			case UPLOAD_ERR_PARTIAL:
				$_notes['error'][] = 'Die Datei wurde nur teilweise hochgeladen.';
				break;
			case UPLOAD_ERR_NO_FILE:
				$_notes['error'][] = 'Es wurde keine Datei hochgeladen.';
				break;
		}

		// Prüfung auf erlaubte Grafikformate
		$imageInfo = @getimagesize($_FILES['file']['tmp_name']);
		if( !isset($imageInfo['mime']) ) {
			$imageInfo['mime'] = null;
		}
		
		switch( $imageInfor['mime'] ) {
			case 'image/gif':
			case 'image/jpeg':
			case 'image/png':
			case 'image/wbmp':
				break;
			default:
				$_notes['error'][] = 'Nur Grafiken des Formats GIF, JPEG, PNG oder BMP sind erlaubt.';
		}

		// Prüfung, ob die Datei bereits existiert
		if( file_exists($destination.$_FILES['datei']['name']) ) {
			$_notes['notice'][] = 'Die Datei mit dem Dateinamen „'.$_FILES['datei']['name'].'“ existierte bereits. Die Datei wurde in „'.$prefix.$_FILES['datei']['name'].'“ umbenannt.';
			$_FILES['datei']['name'] = $prefix.$_FILES['datei']['name'];
		}

		// Falls bisher keine Fehler aufgetreten sind, wird die bisher noch temporäre Datei zum Ziel verschoben
		if( !empty($_notes['error']) ) {
			if( !move_uploaded_file($_FILES['file']['tmp_name'], $destination.$_FILES['file']['name']) ) {
				$_notes['error'][] = 'Die Datei konnte nicht verschoben werden.';
			}
		}

		if( !empty($_notes['error']) ) {
			echo '<div class="note"><ul class="error">';
			foreach( $_notes['error'] as $value ) {
				echo '<li>'.$value.'</li>';
			}
			echo '</ul></div>';
		} else {
			if( !empty($_notes['notice']) ) {
				echo '<div class="note"><ul class="notice">';
				foreach( $_notes['notice'] as $value ) {
					echo '<li>'.$value.'</li>';
				}
				echo '</ul></div>';
			}
			echo '<p>Die Datei „'.$_FILES['datei']['name'].'“ wurde mit '.$_FILES['datei']['size'].' Byte erfolgreich hochgeladen: <a href="'.$destination.$_FILES['datei']['name'].'">'.$destination.$_FILES['datei']['name'].'</a></p>';

			// Schreiben des Namens des neu hochgeladenen Fotos
			$handle = fopen('photo.txt', 'w+');
			$fileContent = array();
			while( !feof($handle) ) {
				$fileContent[] = fgets($handle, 1024);
			}
			$fileContent[] = $_FILES['file']['name'];
			foreach( $fileContent as $line ) {
				fwrite($handle, $line);
			}
			fclose($handle);

		}
	}

?>
<br>
<table cellspacing="15">
	<tr>
		<td><a href="photo_admin.php">Zurück zur Administratoroberfläche</a></td>
		<td><a href="/gallery/photo_view.php">Zurück zur Albenübersicht</a></td>
		<td><a href="photo_upload_form.php">Noch ein Photo hochladen</a></td>
	</tr>
</table>
 
Der Browser meldete

"Warning: ini_set() has been disabled for security reasons in /usr/export/www/vhosts/funnetwork/hosting/.../photo_upload.php on line 3


Warning: Invalid argument supplied for foreach() in /usr/export/www/vhosts/funnetwork/hosting/.../photo_upload.php on line 63
"

Aber danke für deine Mühe.

Ich glaub dass die FUnktion ini_set() einfach vom Webspaceanbieter abgeschaltet wurde...

MfG j!M!
 
Zurück