Ich bekomme die Krise: "Upload-Script funktioniert offline, aber online nicht?!"

walle_89

Mitglied
Ich will ein ganz einfaches Upload-Script machen und auch nutzen. Offline (via XAMPP) läuft es wunderbar, doch online überhaupt nicht. Und es ist auch nicht so, dass ich 7-9 verschiedene Script ausprobiert habe und auch den ganzen Nachmittag damit verbracht habe :mad::mad::mad: Im mom bin ich echt auf 180 ...

Hier schonmal die beiden Dateien, eine zum Absenden, die andere zum Verarbeiten.

contact.php
HTML:
<html>
<body>

<form action="upload_file.php" method="post" enctype="multipart/form-data">
   <p>
      <label for="file">Select a file:</label> <input type="file" name="userfile" id="file"> <br />
      <button>Upload File</button>
   <p>
</form>

</body>
</html>

upload_file.php
PHP:
<?php
   // Configuration - Your Options
      $allowed_filetypes = array('.jpg','.gif','.bmp','.png'); // These will be the types of file that will pass the validation.
      $max_filesize = 524288; // Maximum filesize in BYTES (currently 0.5MB).
      $upload_path = '/upload/'; // The place the files will be uploaded to (currently a 'files' directory).
 
   $filename = $_FILES['userfile']['name']; // Get the name of the file (including file extension).
   $ext = substr($filename, strpos($filename,'.'), strlen($filename)-1); // Get the extension from the filename.
 
   // Check if the filetype is allowed, if not DIE and inform the user.
   if(!in_array($ext,$allowed_filetypes))
      die('The file you attempted to upload is not allowed.');
 
   // Now check the filesize, if it is too large then DIE and inform the user.
   if(filesize($_FILES['userfile']['tmp_name']) > $max_filesize)
      die('The file you attempted to upload is too large.');
 
   // Check if we can upload to the specified path, if not DIE and inform the user.
   if(!is_writable($upload_path))
      die('You cannot upload to the specified directory, please CHMOD it to 777.');
 
   // Upload the file to your specified path.
   if(move_uploaded_file($_FILES['userfile']['tmp_name'],$upload_path . $filename))
         echo 'Your file upload was successful, view the file <a href="' . $upload_path . $filename . '" title="Your File">here</a>'; // It worked.
      else
         echo 'There was an error during the file upload.  Please try again.'; // It failed :(.
 
?>

Dann wird es natürlich in dem Ordern "upload" (mit CHMOD 777) gespeichert. Also Fehlermeldung sagt er mir immer online => "The file you attempted to upload is not allowed." Und ich habe schon darauf geachtet, dass es eine jpg oder bmp Datei ist. Bin hier echt am Verzweifeln - danke euch schonmal!

Gruß, walle_89

P.S. Nutze dieses Script da (http://www.zymic.com/tutorials/php/creating-a-file-upload-form-with-php/)
P.P.S. Online-Version, die nicht klappen will (http://vrugaitis.de/contact.php)
 
Mach mal die Zeile mit $ext so:
PHP:
$ext = substr($filename, strrpos($filename,'.')); // Get the extension from the filename.
var_dump($ext);

Und sieh dir an was PHP jeweils als $ext wert hat.
Und vielleicht bei weiteren Themen eine eindeutigere Überschrift.
 
Das ist der Wert den var_dump dir liefert von dem $ext. Das heißt :
$ext = false;
(in deinem Script) woraus folgt das substr einen false Wert zurückgegeben hat und den in $ext speichert, statt der Extension. Warum substr das gemacht hat steht in der PHP-Referenz:
http://de2.php.net/manual/de/function.substr.php hat gesagt.:
substr ( string $string , int $start [, int $length ] )
[...]
Ist string kürzer als oder gleich start Zeichen, wird FALSE zurückgegeben.
Das heißt $filename ist kürzer als die letzte Fundstelle vom "." (Punkt).
Das zum auffinden verwendete strrpos() kann den Punkt nicht finden wenn er nicht da ist (false) oder es findet ihn direkt an der ersten Stelle (0).
Da hier strrpos ebenfalls mit $filename arbeitet und die Position der "Fundestelle" größer ist als die Länge von $filename, behaupte ich einfach mal $filename ist leer.
Lass also mal ein var_dump von $_FILES['userfile']['name'] machen und von da an suchst du weiter nach dem Fehler, so wie ich ;)

EDIT: Am besten direkt vom ganzen $_FILE-Array um alle Fehlercodes und übergebene Werte zu sehen:
PHP:
echo "<pre>";
var_dump($_FILES);
echo "</pre>";

Und noch mehr zum lesen: http://aktuell.de.selfhtml.org/artikel/php/php-uploadcheck/
 
Zuletzt bearbeitet:
var_dump liefert folgendes:

PHP:
array(0) {
}

Also übergibt er das sicherlich nicht. So gesehen muss doch der Fehler beim Setzen vom "$upload_path" sein?

Ich habe auch via phpinfo() den Path ausgelesen, aber es bringt immer noch nichts ...
 
Zuletzt bearbeitet:
$_FILES ist leer steht dort. Das heißt wirklich, dass NICHTS übertragen wird.
Siehe PHP-Manual zu $_FILES:
http://de2.php.net/manual/de/reserved.variables.files.php hat gesagt.:
Ein assoziatives Array von Elementen, die vom aktuellen Skript via HTTP POST-Methode hochgeladen werden.
Das hätte gar nichts mit deinem $upload_path zu tun. Es ist stumpf, dass keine Datei übertragen wird. Also Fehler durch das Formular und/oder Übertragung, da nicht das Feld "userfile" im Array angezeigt wird. Sonst gäbe es ein $_FILES["userfile"]["error"] was den Fehler zur "Übertragung" anzeigen würde: http://de2.php.net/manual/de/features.file-upload.errors.php

Es mag auch sein das deine PHP Version auf dem Server so alt ist, dass es kein $_FILES gibt, sondern $HTTP_POST_FILES. Was ich aber ausschließe, da var_dump zum $_FILES immerhin Array anzeigt statt gar nichts (NULL).
 
Zuletzt bearbeitet:
Das liegt am Server oder an deinem Formular.
Am besten mal alles einzeln implementieren.

Erst eine EINFACHE Form machen nur mit method="post" und validen (X)HTML (mehr zum Formular für Dateiupload bei SelfHTML).

Danach dann action="dein_script.php" dazu tun und das Script nach und nach aufbauen.

  • Prüfung ob eine Datei übergeben wurde
  • Testen
  • Prüfung für Dateigröße
  • Testen
  • usw....
  • Testen nach jedem Schritt

Und bei einem gewissen Punkt bemerkst du den Fehler. Dazu dürftes mittlerweile schon genügend PHP können und Beispiele in diesem Thema haben. Und Funktionen um zu Testen ob es ein Bild ist und welche Art von Bild gibt es bei PHP wie Sand am Meer. exif_imagetype(), getimagesize() und selbst im Array $_FILES selbst steht sowas wie image/jpg oder image/gif etc.
 
Zurück