WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Dateifunktionen in PHP (http://www.wcm.at/forum/showthread.php?t=152904)

Satan_666 12.12.2004 11:40

Dateifunktionen in PHP
 
hi @all,

mein problem, bei dem ich hoffe, das man mir hier helfen kann:

mit php habe ich eine routine geschrieben, mit der ich über eine html-form eine datei auf den webserver übertragen will. soweit funktioniert mein code auch ganz gut, bis auf eine kleinigkeit: ich möchte nur dateien mit einer bestimmten dateiendung übertragen, beispielsweise nur .gif-dateien. im input-tag habe ich sehr wohl den parameter accept="image/gif" angegeben, jedoch lässt sich mein browser (ie6) damit nicht dazu hinreißen, tatsächlich nur .gif-dateien zu übertragen. und über mein php-script lässt sich hier auch nichts machen, da ich ja lediglich das temporäre file am webserver mitgeteilt bekomme - und dieses hat immer die dateiendung .tmp, ist also nicht unterscheidbar. welche 'tricks' kennt ihr für dieses problem....?

achja, nochwas: mitunter würde ich die übertragene datei auch wieder löschen wollen. nur habe ich in php keine funktion gefunden, die das macht. alle meine dokumentationen diesbezüglich offenbaren mir nicht, wie's geht. ideen dazu....?

thanks!

T.dot 12.12.2004 12:03

ad löschen:
http://www.selfphp.info/funktionsref...nen/unlink.php

für sonstiges würd ich auch mal selfphp durchblättern:
http://www.selfphp.info/funktionsref...em_funktionen/

mfg Thomas

Satan_666 13.12.2004 11:58

danke für die links - aber dieses selfphp habe ich eh zu hause.

dass das löschen einer datei mittels unlink() gemacht wird, ist für mich ziemlich erstaunlich. wer lässt sich so einen namen für's löschen einer datei einfallen....? kein wunder, dass ich nicht fündig geworden bin. :confused:


bezüglich dem anderen problem bin ich samt selfphp nicht weiter gekommen. es gibt zwar die funktion filetype, die liefert aber immer nur '.tmp' zurück - weil ja das der filename am server ist.


für mich schaut es fast so aus, als ob ich diese prüfung auf die gewünschte dateiendung VOR dem versenden in javascript lösen müsste. nur bin ich dort auch noch nicht so firm, dass ich das aus dem ärmel schütteln könnte.... :(

m@rio 13.12.2004 12:34

http://de.php.net/manual/de/features.file-upload.php

$_FILES['userfile']['type']
Der Mime-Type der Datei, falls der Browser diese Information zur Verfügung gestellt hat. Ein Beispiel wäre "image/gif".

T.dot 13.12.2004 13:27

du kannst ja mit:

$_FILES['file']['name']

(wobei 'file' bei mir der name des dateiuploadfeldes ist)

Den Dateinamen auslesen. Dann kannst du ja von hinten beginnend den String bis zum letzten Punkt auslesen -> Dateierweiterung.

Hab hier momentan keine php Testumgebung, werd zuhause mal schaun, ob es noch andere Varianten gibt.

mfg Thomas

Satan_666 13.12.2004 13:36

Zitat:

Original geschrieben von T.dot
du kannst ja mit:

$_FILES['file']['name']

Den Dateinamen auslesen. Dann kannst du ja von hinten beginnend den String bis zum letzten Punkt auslesen -> Dateierweiterung.

Hab hier momentan keine php Testumgebung, werd zuhause mal schaun, ob es noch andere Varianten gibt.

mfg Thomas

ich kanns im moment auch nicht checken, ob das geht - ich vermute aber, dass in $_FILES der dateiname drin steht, wie er nach dem transfer am server steht, und das ist irgend eine xxxx.tmp datei.

interessant finde ich ja auch, dass der parameter 'accept' im input-tag lediglich informellen charakter zu haben scheint. übertragen kann ich trotzdem alles, was ich will.

naja, werde heute abend eure tipps probieren....

T.dot 13.12.2004 13:54

ne, in $_FILES['file']['tmp_name']; steht der Temporäre Name drin, in $_FILES['file']['name'] der wirkliche.

vielleicht gibts auch ein $_FILES['file']['extension'] - keine Ahnung

mfg Thomas

[edit]
google hilft:

$_FILES['userfile']['name']
The original name of the file on the client machine.
$_FILES['userfile']['type']
The mime type of the file, if the browser provided this information. An example would be "image/gif".
$_FILES['userfile']['size']
The size, in bytes, of the uploaded file.
$_FILES['userfile']['tmp_name']
The temporary filename of the file in which the uploaded file was stored on the server.
$_FILES['userfile']['error']
The error code associated with this file upload. ['error'] was added in PHP 4.2.0.

bzw.
http://p2p.wrox.com/topic.asp?TOPIC_ID=2629

[/edit]

_m3 14.12.2004 08:51

Zitat:

Original geschrieben von Satan_666
dass das löschen einer datei mittels unlink() gemacht wird, ist für mich ziemlich erstaunlich. wer lässt sich so einen namen für's löschen einer datei einfallen....?
Tja, da ist es immer gut, wenn man ueber ein wenig Hintergrundwissen verfuegt. :D

<Sinnloses Wissen fuer mind. 500 Euro>
Das Unix-Dateisystem unterscheidet zwischen Daten, die durch eine Inode beschrieben werden und Pfadnamen, die innerhalb von Verzeichnissen auf die Inodes verweisen. Eine Inode kann dabei mehrere Pfadnamen haben, was in der Unix-Terminologie Link genannt wird.

Unter Unix ruft "rm" intern den Systemruf unlink auf, der einen solchen Link und den zugehörigen Pfadnamen entfernt. Die Inode und die Datenblöcke werden aber erst freigegeben wenn
1. der letzte Link auf eine Inode entfernt wird und
2. kein Prozess mehr auf die Daten zugreift.
http://de.wikipedia.org/wiki/Rm_(Unix)

Aus der manpage von unlink:
Zitat:

unlink löscht einen Namen aus dem Dateisystem. Wenn dieser Name der letzte Verweis auf eine Datei war und kein Prozeß die Datei geöffnet hält, wird sie gelöscht und der von ihr belegte Speicherplatz wird für die weitere Benutzung verfügbar gemacht.

Falls dieser Name der letzte Link auf die Datei war und keine Prozesse die Datei geöffnet haben, dann ist die Datei gelöscht und der benötigte Speicherplatz wieder freigegeben.

Falls der Name der letzte Link auf die Datei war, aber immer noch Prozesse die Datei geöffnet haben, bleibt die Datei bestehen bis die letzte Dateikennzahl, die sich auf die Datei bezieht, geschlossen ist.

Falls der Name auf einen symbolischen Link verwies, so ist dieser Link entfernt.

Falls der Name auf einen Socket, Fifo oder Gerät verwies, so ist der Name für dieses entfernt, aber Prozesse, die dieses Objekt geöffnet haben, können es weiterhin benutzen.
http://www.linuxinfor.com/german/man2/unlink.html
Wobei ich die englische Manpage fuer aussagekraeftiger halte: http://www.opengroup.org/onlinepubs/...ns/unlink.html
</Sinnloses Wissen fuer mind. 500 Euro>

Und Erfunden haben das in diesem Fall nicht die Schweizer, sondern vermutlich Dennis Ritchie und Ken Thompson, die Vaeter von C und UNIX.

UNIX is simple and coherent, but it takes a genius (or at any rate a programmer) to understand and appreciate the simplicity.
Dennis Ritchie

T.dot 14.12.2004 09:00

Also mich hat dieses Wissen keine 500€ gekostet, nur ein paar Jahre HTL ;);)

mfg Thomas

Satan_666 14.12.2004 09:32

Zitat:

Original geschrieben von _m3
Tja, da ist es immer gut, wenn man ueber ein wenig Hintergrundwissen verfuegt. :D

*snipped*


thanks für die aufklärung - aber einerseits war die frage mehr ironisch gemeint und andererseits erklärt sich die namensvergabe dadurch auch nicht. ich kenne kein system außer dem sch***-unix (und deren derivate), das sich hier eine eigene (unlogische???) welt aufgebaut hat. das, was du mir hier bildlich beschrieben hast, täuscht nicht darüber hinweg, dass es sich lediglich um interne lösungen eines problemes handelt, mit der ein anwender in wahrheit nicht konfrontiert werden möchte. und ich als verwender einer höheren programmiersprache sehe absolut nicht ein, warum ich mich mit derartigen .... äh, unsinn beschäftigen muss :D

wohl auch ein grund, warum ich mich bislang erfolgreich gegen jede art von linux auf meinem rechner gewehrt habe. ich will effizient arbeiten und mir keine gedanken über etwaige internas des betriebssystems machen müssen. :cool:


@T.dot: hab's gestern getestet - und es funktioniert tatsächlich! :o thanks für die infos....


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag