bitte Überprüfen!

Schiwi

Grünschnabel
Hallo Leutz,

könnt ihr bitte mal mein Script überprüfen, ich steht da grad irgendwie aufm Schlauch, das macht nicht das was es soll...
Besonders die Fehlermeldungen, wie z.b. "Unzulässiges Dateiformat..." und andere werden falsch, bzw gar nicht angezeigt, hat jemand ne Idee?
mfg Schiwi

PHP:
<?
if($_REQUEST['Send'])
{
# Array mit den zulässigen Dateiendungen erzeugen
$zul_endungen = array('gif','png','jpg','exe','zip','jpeg','txt','log','rar','wmv','mpg');
$datei = $_FILES['Datei']['name'];
# Länge des Dateinamens ermitteln
$str_laenge = strlen($datei);
# Position des letzten Punktes ermitteln
$punkt = strrpos($datei, ".");
# Alles vor dem Punkt = Dateiname
$datei_name = substr($datei, 0, $punkt);
# Alles hinter dem Punkt = Dateiendung
$datei_endung = substr($datei, $punkt+1,
$str_laenge);
# Wenn sich die Dateiendung im Array mit den zugelassenen Endungen befindet Upload.
	if(in_array(strtolower($datei_endung),$zul_endungen))
	{

		# Dateinamen prüfen: Nur Buchstaben, Punkt, Unter- und Bindestrich erlaubt:
	     if (ereg('^[a-zA-Z0-9._-]*$', $datei)) 
	     {

		if($_FILES['Datei']['tmp_name'])
		{

			if (file_exists("upload/$datei")) 
			{
	      			echo "Datei " . htmlspecialchars($datei) . " existiert schon!";
			}

			else 
			{
			echo"Ihre Datei (&quot;",
				$_FILES['Datei']['name'],
				"&quot;) ist ",
				$_FILES['Datei']['size'],
				" Bytes groß.<br>";
				if (move_uploaded_file($_FILES['Datei']['tmp_name'], "upload/".$_FILES['Datei']['name'])) 
				{
      				  echo "Sie können die Datei unter <a href=\"http://schiwi.ath.cx/upload/upload/".$_FILES['Datei']['name']."\">http://domain/upload/".$_FILES['Datei']['name']."</a> downloaden";
				}
				else 
				{
					if ($_FILES['Datei']['error'] == 1)
					{
					echo "Die hochgeladene Datei überschreitet die in der php.ini festgelegte Größe.";
					}
					elseif ($_FILES['Datei']['error'] == 2)
					{
					echo "Die hochgeladene Datei überschreitet die in dem HTML Formular angegebene maximale Dateigröße.";
					}
					elseif ($_FILES['Datei']['error'] == 3)
					{
					echo "Die Datei wurde nur teilweise hochgeladen.";
					}
					elseif ($_FILES['Datei']['error'] == 4)
					{
					echo "Es wurde keine Datei hochgeladen.";
					}
					else echo "Es ist ein Fehler Aufgetreten";
				}

			
			}
		}
		else echo "Bitte geben Sie eine Datei an!";
		
	    }
	    else echo "Fehler: Ungültiger Dateiname " . htmlspecialchars($datei);
	}
	else 
	{
	echo "Unzulässiges Dateiformat, zulässig sind nur ";
	foreach ($zul_endungen as $endung) 
		{
    		echo " $endung,";
		}
   	}

}

else
{
?>

Hier kannst du mir Dateien zukommen lassen<br></p>
<form action="<? $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data" method="post">
<input name="Datei" type="file"><br>
<input name="Send" type="submit" value="Upload">
</form>
<p><br></p>Sehen kannst du die Dateien <a href="upload/"><b>hier</b></a>
</body>
</html>

<?
}
?>
 
Hallo,
dein Skript funktioniert doch. Du hast sicherlich vergessen die Rechte richtig einzustellen (s. "chmod").
Ansonsten würde ich dir noch empfehlen, das Skript etwas übersichtlicher zu schreiben und es ggf. in eine Funktion zu packen. Außerdem wäre eine IP Sperre für ein paar Sekunden gegen Dateiflut und ein CAPTCHA gegen Bots ganz nützlich. Und $_POST > $_REQUEST IMHO...

So könnte es aussehen (ohne IP Sperre / CAPTCHA):
PHP:
<html>
  <head>
    <title>Dateien hochladen</title>
  </head>
  <body>
<?
function hochladen($datei, $ordner){
  $zul_endungen = array('gif', 'png', 'jpg', 'jpeg', 'exe', 'zip', 'jpeg', 'txt', 'log', 'rar', 'wmv', 'mpg');
  
  if(!$_FILES[$datei]['tmp_name']){
    echo("Fehler: Bitte geben Sie eine Datei an!");
    return false;
  }
  
  if(!@ereg('^[a-zA-Z0-9._-]*$', $_FILES[$datei]['name'])){
    echo("Fehler: Ungültiger Dateiname ".htmlspecialchars($_FILES[$datei]['name'])."!");
    return false;
  }
  
  if(!in_array(strtolower(substr(strrchr($_FILES['Datei']['name'], "."), 1)), $zul_endungen)){
    echo("Fehler: Unzulässiges Dateiformat, zulässig sind nur");
    for($i = 0; $i < count($zul_endungen); $i++){
      echo(" ".$zul_endungen[$i]);
      if($i != count($zul_endungen)-1) echo(",");
    }
    echo("!");
    return false;
  }

  if(@file_exists('./'.$ordner.'/'.$_FILES[$datei]['name'])){
    echo("Fehler: Datei <a href=\"./".$ordner."/".$_FILES[$datei]['name']."\">".$_FILES[$datei]['name']."</a> existiert schon!");
    return false;
  }
  
  if(!@is_dir($ordner)){
    echo("Fehler: Ordner ".$ordner." existiert nicht!");
    return false;
  }
  
  if(@move_uploaded_file($_FILES[$datei]['tmp_name'], './'.$ordner.'/'.$_FILES[$datei]['name'])){
    echo("Die Datei <a href=\"./".$ordner."/".$_FILES[$datei]['name']."\">".$_FILES[$datei]['name']."</a> (".round($_FILES[$datei]['size']/1024, 2)."KB) wurde hochgeladen.");
    return true;
  }
  
  switch($_FILES[$datei]['error']){
    case 1:
      echo("Fehler: Die hochgeladene Datei überschreitet die in der php.ini festgelegten Größe.");
      break;
    
    case 2:
      echo("Fehler: Die hochgeladene Datei überschreitet die in dem HTML Formular angegebene maximale Dateigröße.");
      break;
    
    case 3:
      echo("Fehler: Die Datei wurde nur teilweise hochgeladen.");
      break;
    
    case 4:
      echo("Fehler: Es wurde keine Datei hochgeladen.");
      break;
    
    default:
      echo("Fehler: Die Datei konnte nicht hochgeladen werden.");
      break;
  }

  return false;
}

$ordner = 'upload';

if($_POST['Send'] == 'Hochladen'){
  hochladen('Datei', $ordner);
}else{
  echo("  <p>Hier kannst du Dateien hochladen:</p>\n".
       "  <form action=\"#\" enctype=\"multipart/form-data\" method=\"post\">\n".
       "  <input name=\"Datei\" type=\"file\" /><br />\n".
       "  <input name=\"Send\" type=\"submit\" value=\"Hochladen\" />\n".
       "  </form><br />\n".
       "  Sehen kannst du die Dateien <a href=\"./".$ordner."/\"><strong>hier</strong></a>.\n");
}
?>
  </body>
</html>

PS: Google -> "MiME Typen". Bietet auch nochmal etwas mehr "Schutz", denke ich.
 
$datei_endung = substr($datei, $punkt+1, $str_laenge); ersetzen mit:

$datei_endung = substr($datei, $punkt, $str_laenge);

Ich denke mal das liegt daran, weil du in der if-Abfrage überprüfst ob es in dem Array vorhanden ist, was es auch nicht sein kann weil er dann xe, if, pg, ....... ausliest. :)
Du kannst niemals davon ausgehen das die normalen $_FILES Fehlermeldung dir weiterhelfen können, das Script muss an sich schon wissen was es machen soll, also muss du feste sachen eingeben. Schau mal genauer in dein script ;)

MfG
KD3
 
$datei_endung = substr($datei, $punkt+1, $str_laenge); ersetzen mit:

$datei_endung = substr($datei, $punkt, $str_laenge);
Ich denke mal das liegt daran, weil du in der if-Abfrage überprüfst ob es in dem Array vorhanden ist, was es auch nicht sein kann weil er dann xe, if, pg, ....... ausliest. :) ...
Wenn man keine Ahnung hat...
dann einfach ausprobieren und nicht Quatsch posten!
PHP:
<?php
$datei = "EinBild.png";
$datei_endung = substr($datei, strrpos($datei, ".")+1, strlen($datei)); //entspricht substr($datei, $punkt+1, $str_laenge);
$dein_weg = substr($datei, strrpos($datei, "."), strlen($datei));
echo("Richtig: ".$datei_endung."<br />". // png
     "Falsch (dein Weg): ".$dein_weg);   // .png
?>

Nebenbei habe ich bereits geschrieben, dass sein Skript zu 100% funktioniert. :rolleyes:
 
danke l0c4lh05t,

das problem bei mir waren die else, wenn ich eine zu große Datei hochgeladen habe, kam gar nichts, nichmal ein fehler, wenn POST leer war, kam statt echo "Bitte geben Sie eine Datei an!", die Meldung "Unzulässiges Dateiformat".
Is wohl ein problem mit den verschachtelten if abfragen....
Danke fürs umschreiben, sieht schön aus, werds mal ausprobieren :)

Gruß Schiwi


(Nachtrag: Auch bei deiner Version kommt keine Felhermeldung bei zu großen Dateien, leerer POST wird jetzt aber richtig angezeigt)
 
Zuletzt bearbeitet:
(Nachtrag: Auch bei deiner Version kommt keine Felhermeldung bei zu großen Dateien, leerer POST wird jetzt aber richtig angezeigt)
Hmm, vielleicht so:
PHP:
<html>
  <head>
    <title>Dateien hochladen</title>
  </head>
  <body>
<?
function hochladen($datei, $ordner){
  $zul_endungen = array('gif', 'png', 'jpg', 'jpeg', 'exe', 'zip', 'jpeg', 'txt', 'log', 'rar', 'wmv', 'mpg');
  
  if(!$_FILES[$datei]['tmp_name']){
    echo("Fehler: Bitte geben Sie eine Datei an!");
    return false;
  }
  
  if(!@ereg('^[a-zA-Z0-9._-]*$', $_FILES[$datei]['name'])){
    echo("Fehler: Ungültiger Dateiname ".htmlspecialchars($_FILES[$datei]['name'])."!");
    return false;
  }
  
  if(!in_array(strtolower(substr(strrchr($_FILES['Datei']['name'], "."), 1)), $zul_endungen)){
    echo("Fehler: Unzulässiges Dateiformat, zulässig sind nur");
    for($i = 0; $i < count($zul_endungen); $i++){
      echo(" ".$zul_endungen[$i]);
      if($i != count($zul_endungen)-1) echo(",");
    }
    echo("!");
    return false;
  }

  if(@file_exists('./'.$ordner.'/'.$_FILES[$datei]['name'])){
    echo("Fehler: Datei <a href=\"./".$ordner."/".$_FILES[$datei]['name']."\">".$_FILES[$datei]['name']."</a> existiert schon!");
    return false;
  }
  
  if(!@is_dir($ordner)){
    echo("Fehler: Ordner ".$ordner." existiert nicht!");
    return false;
  }
  
  if(@move_uploaded_file($_FILES[$datei]['tmp_name'], './'.$ordner.'/'.$_FILES[$datei]['name'])){
    echo("Die Datei <a href=\"./".$ordner."/".$_FILES[$datei]['name']."\">".$_FILES[$datei]['name']."</a> (".round($_FILES[$datei]['size']/1024, 2)."KB) wurde hochgeladen.");
    return true;
  }
  
  switch($_FILES[$datei]['error']){
    case 'UPLOAD_ERR_INI_SIZE':
      echo("Fehler: Die hochgeladene Datei überschreitet die in der php.ini festgelegten Größe.");
      break;
    
    case 'UPLOAD_ERR_FORM_SIZE':
      echo("Fehler: Die hochgeladene Datei überschreitet die in dem HTML Formular angegebene maximale Dateigröße.");
      break;
    
    case 'UPLOAD_ERR_PARTIAL':
      echo("Fehler: Die Datei wurde nur teilweise hochgeladen.");
      break;
    
    case 'UPLOAD_ERR_NO_FILE':
      echo("Fehler: Es wurde keine Datei hochgeladen.");
      break;
    
    default:
      echo("Fehler: Die Datei konnte nicht hochgeladen werden.");
      break;
  }

  return false;
}

$ordner = 'upload';

if($_POST['Send'] == 'Hochladen'){
  hochladen('Datei', $ordner);
}else{
  echo("  <p>Hier kannst du Dateien hochladen:</p>\n".
       "  <form action=\"#\" enctype=\"multipart/form-data\" method=\"post\">\n".
       "    <input name=\"Datei\" type=\"file\" /><br />\n".
       "    <input name=\"Send\" type=\"submit\" value=\"Hochladen\" />\n".
       "  </form><br />\n".
       "  Sehen kannst du die Dateien <a href=\"./".$ordner."/\"><strong>hier</strong></a>\n");
}
?>
  </body>
</html>
 
moin

nein, so kommt auch nichts, liegt aber wohl nicht am script, hab das script auf das nötigste reduziert, auch verschiedene scripts ausprobiert, immer keine meldung.
Liegt dann wohl an meinem Server

Danke für die mühe
Schiwi
 
Zurück