PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler im Uploadscript


diehappy
13.07.2006, 22:48:52
Moin

Sorry das schon wieder ein Thema mit nem Uploadscript kommt. :D
Ich hab hier ein kleines Script das ich mit ein wenig hilfe versucht hab etwas zu verbessern. Sieht auch alles sehr schön aus. Nur funktionierts nicht und ich find den oder die Fehler beim besten willen nicht. Vielleicht kann sich das mal jemand anschauen und ggf. testen.
Es kommen keine Fehlermeldungen, keine Bestätigung das was hochgeladen wurde und es wird nichts hochgeladen. Ich denke/hoffe das Script ist einigermasen übersichtlich.
<?php
ini_set ('error_reporting', E_ALL);
$pfad = 'upload/';
$dateiupload_erfolgreich = false;


function CheckFilename($dateiname,$pfad)
{
global $fehler; $fehler = array();
if (file_exists($pfad.$dateiname)) array_push($fehler, 'Es existiert bereits eine Datei mit dem Namen!');
if(!in_array(strtolower(substr($dateiname,-4)),array('.jpg','jpeg','.png','.gif'))) array_push($fehler, 'Bitte nur Bilder mit der Endung .jpg, .jpeg, .png oder .gif hochladen!');
return (sizeof($fehler)) ? $dateiname : false;
}


function CheckFile($dateiname_temp,$dateifehler,$dateigroesse)
{
global $fehler; $fehler = array();
switch ($dateifehler) {
case '1': $dateifehler_erklaerung ='Die hochgeladene Datei überschreitet die in der Anweisung upload_max_filesize in php.ini festgelegte Größe.'; break;
case '2': $dateifehler_erklaerung = 'Die hochgeladene Datei überschreitet die in dem HTML Formular mittels der Anweisung MAX_FILE_SIZE angegebene maximale Dateigröße.'; break;
case '3': $dateifehler_erklaerung = 'Die Datei wurde nur teilweise hochgeladen.'; break;
case '4': $dateifehler_erklaerung = 'Es wurde keine Datei hochgeladen.'; break;
}
if($dateifehler) array_push($fehler, $dateifehler_erklaerung);
if ($dateigroesse < 1) array_push($fehler, 'Sie haben versucht keine oder eine lehre Datei hochzuladen.');
return (sizeof($fehler)) ? $dateiname_temp : false;
}


if(!empty($_POST['Send']))
{
if ($dateiname = CheckFilename($_FILES['Datei']['name'],$pfad))
{
if ($dateiname_temp = CheckFile($_FILES['Datei']['tmp_name'],$_FILES['Datei']['error'],$_FILES['Datei']['size']))
{
move_uploaded_file($dateiname_temp, $pfad.$dateiname);
if (filesize($pfad.$dateiname)<1) die ('Sie haben versucht eine leerer Datei hochzuladen!');
$dateiupload_erfolgreich = true;
}
else $fehlermeldungen_ausgeben = true;
}
else $fehlermeldungen_ausgeben = true;
}




?>
<html>
<head>
<title>Datei-Upload</title>
</head>
<body>
<?php
if ($dateiupload_erfolgreich)
{
?>Ihre Datei (&quot;<?php echo $dateiname; ?>&quot;) wurde hochgeladen. Sie können nun weitere Dateien hochladen.<?php
}
elseif (!empty($fehler))
{
?>
<br>Es sind folgende Fehler aufgetreten:<br>
<?php
foreach ($fehler as $fehlermeldung) {
echo $fehlermeldung.'<br>';
}
?>Beseitigen sie wenn möglich den Fehler und versuchen sie es erneut.<?php
}
?>


<form action="<?php echo $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data" method="post">
<input name="Datei" type="file"><br>
<input name="Send" type="submit" value="Upload">
</form>
</body>
</html>

xabbuh
13.07.2006, 23:37:40
Verwende erst einmal Testausgaben, um zu prüfen, welche der Zweige der einzelnen Bedingungen überhaupt durchlaufen werden. So lässt sich das Problem schon mal ein wenig eingrenzen.

diehappy
14.07.2006, 00:09:10
Moin

Beide Funktionen werden durchlaufen aber die zweite Funktion gibt wohl false zurück denn die if-Abfrage if ($dateiname_temp = CheckFile($_FILES['Datei']['tmp_name'],$_FILES['Datei']['error'],$_FILES['Datei']['size'])) wird nicht mehr durchlaufen.
Wenn ich aber vor dem return in Funktion CheckFile mal die Fehler ausgeben möchte mit foreach ($fehler as $fehlermeldung) {
echo $fehlermeldung.'<br>'; } wird nichts angezeigt.

Wie ist es eigentlich mit der globalen Variable $fehler. Die muß ich doch eigentlich nicht in beiden Funktionen difinieren?!
global $fehler; $fehler = array();

xabbuh
14.07.2006, 10:08:34
Ermittel dazu am besten mit var_dump() (http://www.php.net/var_dump), was CheckFilename() und CheckFile() zurückgeben.

diehappy
14.07.2006, 15:07:33
Moin

Wenn ich versuch ein Bild hochzuladen, was ja erlaubt ist, gibt die Funktion CheckFilename schon false zurück.

Bei einer unerlaubten Datei (hier asnr_96_3.pdf) geben die Funktionen folgendes zurück:
Funktion CheckFilename: string(13) "asnr_96_3.pdf"
Funktion CheckFile: bool(false)


Aber diese Zeile ist doch richtig?:
if(!in_array(strtolower(substr($dateiname,-4)),array('.jpg','jpeg','.png','.gif'))) array_push($fehler, 'Bitte nur Bilder mit der Endung .jpg, .jpeg, .png oder .gif hochladen!');

Langsam kommt es mir so vor als hätte ich irgendwo eine Negation zuviel oder zuwenig. *grübel*

xabbuh
14.07.2006, 15:28:18
Was mir gerade aufgefallen ist:


return (sizeof($fehler)) ? $dateiname : false;

Wenn das Array leer ist, also keine Fehler aufgetreten sind, liefert die Funktion false. Das sollte wohl eher anders herum sein.

diehappy
14.07.2006, 17:06:49
Moin

Das scheints gewesen zu sein! Muß return (sizeof($fehler)) ? false : $dateiname; bzw return (sizeof($fehler)) ? false : $dateiname_temp; sein.
Ich muß noch testen ob auch wirklich alle Fehler als solche erkannt werden, aber auf den ersten Blick siehts sehr gut aus.
Danke! :)