[PHP] File Upload

ne2112

Cadet 3rd Year
Registriert
Juni 2002
Beiträge
63
Hi zusammen,

ich habe vor kurzen mal angefangen etwas mit PHP rumzuspielen.

Dabei trat folgendes Problem auf, als ich versuchte eine einfache File-Upload-Seite zu erstellen, bei der mal alle beliebigen Files uploaden kann:

wenn ich im Formular folgede Zeile stehen hatte:

<form action="index.php" enctype="multipart/form-data" method="post">

Dann funktioniert es. Das Problem ist allerdings, dass die Datei dann als TMP Datei aus dem Windows Temp Verzeichnis übergeben wird und ich so keine Chance habe, auf die Endung zu schließen.

wenn ichs so mache:

<form action="index.php" enctype="multipart/form-data" method=get>

Dann kriege ich den korrekten Dateinamen, allerdings kann die datei dann nich upgeloaded werden. (Nur dann, wenn ichs auf meinem Server direkt test).


Ich verwende, falls das von interesse ist, z.Zt. Omnihttpd unter Windows ME.

Wie sieht das mit Linux aus?

Aber ich denke, dass der Client Rechner die Datei aus Sicherheitsgründen nicht freigibt.

Wie komme ich an den Dateinamen?

Gruß und vielen Dank im Voraus...

Nils

============================
Nicht lachen, fürs ME kann ich auch nix, kann nur kein XP mehr installieren, weil mein System die GF4 nicht mag, Problem wird aber gerade behoben!
 
Fileupload sollte grundsätzlich nur mit mit "Post" funktionieren. Eine Verarbeitung über "Get" ist glaube ich nicht möglich.
Lässt dein Server Fileuploads per PHP zu?.

Wenn du willst poste ich dir ein kleines PHP Script was dir den Filenamen und die größe ausgeben sollte.
 
Bin bereits fündig geworden...

Hi,

mein Problem hat sich erledigt. Aber für alle, die die Lösung auch wissen wollen:

Wenn der Client die Daten abschickt, wird im Script ein assoziatives array $HTTP_POST_FILES erstellt.

$HTTP_POST_FILES['userfile']['name']; // Dateiname z.b. foto.jpg
$HTTP_POST_FILES['userfile']['type']; // Dateityp z.B. image/pjpeg
$HTTP_POST_FILES['userfile']['tmp_name'] // Der Temporäre Dateiname auf dem Clientrechner
$HTTP_POST_FILES['userfile']['size'] // Die Dateigröße

So war ist es dann möglich, wenn man mit explode(".",$name) (oder auch anders) die Endung rauskriegt, die Datei vernünftig zu speichern. ($name = $HTTP_POST_FILES['userfile']['name'] vorausgesetzt).


Viel Spaß,

PHP rulez :D :D :D

Gruß,

Nils
 
AW: Re: Bin bereits fündig geworden...

ich möchte auch noch eine kleine Frage dazustellen. Gibt es eine einfache Möglichkeit zu prüfen ob die hochgeladene Datei die Endung "mp3" hat. Ich bin ein absoluter Anfänger was PHP angeht und finde immer nur Funktionen, die mir Imagetypen prüfen.

Danke schonmal :)
 
Hallo,

dies kannst du zum Beispiel so prüfen:

PHP:
if(preg_match("/^.+\.mp3$/is", $_FILES['userfile']['name']) == 1)
{
  echo "Dateiendung ist \"mp3\"!";
}
else
{
  echo "andere Dateiendung!";
}
MfG mh1001
 
Zuletzt bearbeitet:
Vielen Dank. Ich hab auch noch eine ein bisl umständlichere Lösung rausbekommen:


PHP:
$filename = $_FILES['datei']['name'];
$array_file = explode(".",$filename);

if($array_file[1] != "mp3")
{
echo "Du musst eine mp3 Datei hochladen";

.....

mfg Denis
 
Eine einfache Methode ist folgende.
PHP:
$datei = $HTTP_POST_FILES['userfile']['name'];
$ext = strtolower(strrchr($datei, '.'));

if($ext==".mp3") { ... }
Das strtolower dient dazu, dass man nur auf die kleingeschriebene Variante von mp3 überprüfen muss. Bedenke auch, dass in der $ext-Variable der Punkt noch als Teil der Dateiendung enthalten ist.

//edit
@den[N]is: Ein Problem bei deiner Variante ist, dass eine Datei namens "test.mp3.exe" auch als mp3-Datei erkannt wird, weil du ja nur $array_file[1] prüfst.
 
Zuletzt bearbeitet:
da habe ich gleich noch eine Frage. Im Moment habe ich eine Template Datei und include verschiedene Sachen. Nun passiert wenn ich per "die" eine Verbindung zur DB abbreche folgendes. Das Template wird nur bis zur Hälfte geladen. Es fehlt immer der untere Teil. Für mich sieht es so aus als würde "die" das rendern komplette unterbrechen. Wie bekomme ich trotz "die" das ganze template geladen?

mfg Denis
 
Du brichst Datenbank-Verbindungen per die() ab? Diese Funktion bewirkt, dass der PHP-Parser unterbrochen wird und die bislang ausgegebenen Daten an den Client geschickt werden. Somit ist es kein Wunder, dass die Template-Datei nicht vollständig geladen wird.

Um eine Datenbankverbindung abzubrechen, musst du mysql_close() oder entsprechende Funktionen ($db->close() bei MySQLi) verwenden.
 
hab ich auch gemerkt dann :) Hätte mal gleich die Doku lesen sollen. Sorry für die Umstände.

mfg Denis
 
Zurück
Oben