überprüfen ob Datei vorhanden und Endung ermitteln
Motzi
- php
Ich möchte vor dem Ausgeben einer Datei prüfen ob es diese auch gibt. es gibt diese nur einmal, es können aber verschiedene Endnungen sein, wie zip, pdf, jpg
Wenn ich eine überprüfe wo ich die Endung kenne, bekomme ich das mit
if (file_exists('100.zip'))
hin,
ich möchte aber überprüfen, ob es eine Datei mit 100 gibt und dann die Endung ausgeben.
Also abfragen ob 100 vorhanden ist, und welche Endung es hat.
Weis jemand wie ich das machen kann?
Motzi
@@Motzi:
nuqneH
Ich möchte vor dem Ausgeben einer Datei prüfen ob es diese auch gibt. es gibt diese nur einmal, es können aber verschiedene Endnungen sein, wie zip, pdf, jpg
Warum willst du das prüfen? Löst vielleicht MultiViews dein Problem?
Qapla'
Super das glob wars, aber jetzt hab ich noch ein Problem das vorher auftritt.
wenn ich abspeicher, will ich den Namen ändern, aber nicht die Endung.
also aus xxxxxxxxx.zip soll 100.zip, bzw. aus xxxxxxxxxxxxx.doc soll 100.doc werden
if( is_uploaded_file ( $_FILES['userfile_doc']['tmp_name'] ) )
{
$endung <---
move_uploaded_file($_FILES['userfile_doc']['tmp_name'], 'verzeichnis/100.'.$endnung);
}
wie bekommt die var $endung die endnung $_FILES['userfile_doc']['tmp_name']
Motzi
Moin,
wie bekommt die var $endung die endnung $_FILES['userfile_doc']['tmp_name']
// ungetestet
$endung = substr($_FILES['userfile_doc']['tmp_name'], strrpos($_FILES['userfile_doc']['tmp_name'], "."));
Aber das ist nur ein Beispiel. Es funktioniert nicht, wenn der Dateiname keinen Punkt enthält. Darauf musst du noch prüfen und den Fall entsprechend behandeln.
Grüße Marco
Hello,
wie bekommt die var $endung die endnung $_FILES['userfile_doc']['tmp_name']
Das hat keine Endung.
Eine Endung hat nur $_FILES['userfile_doc']['name'].
Das ist der Name, den der Benutzer dem Upload mitgibt.
Erstmal schneidet man tunlichst den Dateinamen raus aus dem Pfad
$filename = basename($_FILES['userfile_doc']['name']);
Und dann kann man mittels der Funktion pathinfo()
http://de3.php.net/manual/en/function.pathinfo.php
Die Zerlegung betreiben.
Da aber die Endung für den vollständigen Filenamen nur eine Lüge des Users ist, ist diese sowiewso ziemlich wertlos. Da kann sich hinter einem "mein_bild.jpg" durchaus ein PHP-Script oder sonstige Gemeinheiten verstecken.
Bitte achtet darauf, dass Ihr keine Files unter dem "Originalnamen", den der User mit hochlädt, in Euer Dateisystem speichert. Da könnte dann ebenfalls schon mal ein Script, oder eine '.htaccess' dabei sein!
Außerdem sollte das Verzeichnis, in dem die Files geparkt werden, entweder außerhalb der DOCUMENT-ROOT liegen, oder mindestens die PHP-Engine abgeschaltet werden:
#.htaccess
php_value engine o
Die .htaccess-Datei sollte tunlichst NICHT durch PHP-Scripte (also den Webserver selber) beschreibbar sein!
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
ich sehe schon, das ist der falsche Weg.
Super das glob wars, aber jetzt hab ich noch ein Problem das vorher auftritt.
wenn ich abspeicher, will ich den Namen ändern, aber nicht die Endung.
also aus xxxxxxxxx.zip soll 100.zip, bzw. aus xxxxxxxxxxxxx.doc soll 100.doc werden
if( is_uploaded_file ( $_FILES['userfile_doc']['tmp_name'] ) )
{$endung <---
move_uploaded_file($_FILES['userfile_doc']['tmp_name'], 'verzeichnis/100.'.$endnung);
}wie bekommt die var $endung die endnung $_FILES['userfile_doc']['tmp_name']
Unabhängig davon, dass noch die alte Geschichte mit "is_uploded_file()" offen ist...
das ist mMn antiquiert, seit es $_FILES gibt,
sollte man
if ($_FILES['uploadname'][$error] === 0) fragen.
wenn ein (1) File als Upload erwartet wird.
Zum Übertragen der Datei aus dem hoffentlich für jede Domain getrennt angelegten upload_tmp_dir http://de3.php.net/manual/en/ini.core.php#ini.upload-tmp-dir
sollte man die Datei nicht mit move_uploaded_file() verschieben (ebenfalls antiquiert), da es keinerlei Rücksicht auf das Vorhandensein des Zieles nimmt.
Besser
Quellfile öffnen
Quellfile sperren (shared reicht)
Zielfile öffnen mit Arrtibut (xb), wenn man nachher sofort lesen will mit (xb+)
Wenn das schief geht, war das File schon da und man muss eben mit anderem Namen
nochmal probieren. (*)
Zielfile sperren (exclusive)
Daten aus dem Quellfile ins Zielfile übertragen
Beide Files wieder schließen.
Das TMP-File verschwindet beim Scriptende automatisch, obwohl es _keine__echte__Temporärdatei ist. Das übernimmt abe PHP.
http://de3.php.net/manual/en/function.fopen.php
Du schaffst Du sonst an ein bis zwei Stellen ein TOCTTOU-Problem.
https://de.wikipedia.org/wiki/Time-of-Check-to-Time-of-Use-Problem
(*) noch ein Tipp zur Güte:
Vermutlich benutzt Du ja eine Datenbank, um deine Daten zu verwalten. Wenn Du nun jeder Datei einen Datensatz in einer Tabelle mit Primary-Key zuordnest, in dem der Eigentümer, Upload-Datum, Größe, der MIME-Type, die Endung, usw. gespeichert werden, dann kannst Du die abgelegte Datei im Dateisystem einfach "$id.$extension" nennen und alles wird gut.
Den MIME-Type entnimmst Du bitte nicht dem $_FILES-Array, sondern bestimmst ihn mit der Funktion:
function get_mime_type($path)
{
$_version = explode('.',phpversion());
if (($_version[0] < 5) or (($_version[0] == 5) and ($_version[1] < 3))) return false;
if (!function_exists('finfo_open')) return false;
if (!$finfo = finfo\_open(FILEINFO\_MIME\_TYPE)) return false;
$mime\_type = finfo\_file($finfo, $path);
finfo\_close($finfo);
return $mime\_type;
}
siehe auch im SelfHTMT-Wiki unter "Fileupload". Das Wiki steht aber im Moment.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Om nah hoo pez nyeetz, Tom!
siehe auch im SelfHTMT-Wiki unter "Fileupload". Das Wiki steht aber im Moment.
Ich reiche mal den Link nach. http://wiki.selfhtml.org/wiki/Artikel:PHP/File_Upload
Matthias