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....

T.dot 14.12.2004 09:42

Zitat:

Original geschrieben von Satan_666
ich kenne kein system außer dem sch***-unix (und deren derivate), das sich hier eine eigene (unlogische???) welt aufgebaut hat.

Also unlogisch ist das imho nicht. Nachdem php von der linuxseite her kommt, und auch unter Linux entwicklet wurde (denke ich halt mal) wird der Programmierer einfach den für ihn logischsten Befehl genommen haben und Dateien wieder zu löschen - das ist in diesem Fall eben unlink.

Zitat:

Original geschrieben von Satan_666
und ich als verwender einer höheren programmiersprache sehe absolut nicht ein, warum ich mich mit derartigen .... äh, unsinn beschäftigen muss :D
naja, ganz ehrlich - php würd ich nicht wirklich als höhere Programmiersprache bezeichnen - nur weil es sich irgendwie von C ableitet. Und als Programmierer musst du dich nicht unbedingt damit beschäftigen, welchen Namen ein Befehl hat - du musst nur den Befehl wissen. Und den findest du glaub ich ohne Probleme in Google ;)

mfg Thomas

_m3 14.12.2004 10:02

Weder C, noch PHP sind IMHO "hoehere" Programmiersprachen.

Smalltalk anyone? ;)

Satan_666 14.12.2004 13:57

Zitat:

Original geschrieben von _m3
Weder C, noch PHP sind IMHO "hoehere" Programmiersprachen.

Smalltalk anyone? ;)

nach der MIR bekannten definition ist alles eine höhere programmiersprache, die sich deutlich von der syntax des maschinencodes abhebt. imho zähle ich beispielsweise assembler und meinetwegen auch c zu den nicht höheren programmiersprachen - da sich aber php zum großteil in klaren befehlstexten auszeichnet, gilt sie als höhere programmiersprache.

aber ist sicher definitionssache..... :D

Satan_666 14.12.2004 14:07

Zitat:

Original geschrieben von T.dot
Also unlogisch ist das imho nicht. Nachdem php von der linuxseite her kommt, und auch unter Linux entwicklet wurde (denke ich halt mal) wird der Programmierer einfach den für ihn logischsten Befehl genommen haben und Dateien wieder zu löschen - das ist in diesem Fall eben unlink.
also, wenn DAS logisch sein soll, dann weiß ich nicht - dann habe ich wohl 22 jahre in der programmierten edv mit falschen grundvoraussetzungen gearbeitet.... :lol:

im ernst: der befehl für das löschen einer datei nennt sich allgemein delete, oder meinetwegen auch purge oder erase oder remove..... aber unlink???

aber ich habe sowieso das gefühl, dass viele pc-geschädigte nur darauf aus sind, sich in irgend einer form ein denkmal zu setzen. und da reicht vielen offenbar auch konfuse benennungen.

nur so zum nachdenken: in den erwähnten 22 jahren habe ich es mit etlichen sprach-systemen zu tun gehabt. da fallen mir auf anhieb zumindest 8 unterschiedliche varianten ein, wie man ein simples if-statement abschließt. beispielsweise mit einem einfachen end oder auch mit einem end-if oder mit einem endif (ohne bindestrich) oder mit if-end oder mit ifend (wieder ohne bindestrich) oder mit } (geschweifte klammer zu) oder mit einem punkt (in cobol-74) oder - ganz doof - mit fi (if rückwärts geschrieben, ganz nach unix-feeling) usw.

ist das nicht total trottelhaft....? :confused: wem oder was soll das dienlich sein?

käptn 14.12.2004 15:32

Also wenn ich mir diesen Thread so durchlese kommt mir das kotzen, lieber Herr OP.

~

dreamer 14.12.2004 15:53

Den Check, ob Dateien lt. Endung raufgeladen werden dürfen, hab ich bei einem Projekt mal so gelöst. Es ist wahrscheinlich net das gelbe vom Ei, aber es hat funktioniert ;)

PHP-Code:

$ext_array = array("doc""xls""zip""pdf""jpg""jpeg""gif"); // Folgende Dateien dürfen hochgeladen werden

foreach ($HTTP_POST_FILES as $strFieldName => $arrPostFiles){
  if (
$arrPostFiles['size'] > 0) {
    
$ext strrchr($arrPostFiles['name'], ".");
    
$ext str_replace("."""$ext);
    if (
in_array($ext$ext_array)) {
      
Datei-Upload
    
}
    else {
mach irgendwas oder nix}
  }



Satan_666 14.12.2004 15:55

Zitat:

Original geschrieben von käptn
Also wenn ich mir diesen Thread so durchlese kommt mir das kotzen, lieber Herr OP.

~

tipp von mir: dann lies ihn einfach net durch.... :lol:

Satan_666 14.12.2004 15:58

Zitat:

Original geschrieben von dreamer
Den Check, ob Dateien lt. Endung raufgeladen werden dürfen, hab ich bei einem Projekt mal so gelöst. Es ist wahrscheinlich net das gelbe vom Ei, aber es hat funktioniert ;)

PHP-Code:

$ext_array = array("doc""xls""zip""pdf""jpg""jpeg""gif"); // Folgende Dateien dürfen hochgeladen werden

foreach ($HTTP_POST_FILES as $strFieldName => $arrPostFiles){
  if (
$arrPostFiles['size'] > 0) {
    
$ext strrchr($arrPostFiles['name'], ".");
    
$ext str_replace("."""$ext);
    if (
in_array($ext$ext_array)) {
      
Datei-Upload
    
}
    else {
mach irgendwas oder nix}
  }



danke dreamer - aber jetzt krieg ich das schon hin. bei mir ist's eh leicht, weil ich nur gif's zulassen werde.

T.dot 14.12.2004 16:10

@Käptn: was ist den so schlimm an dem Thread?

[eh scho komplettes OT]
Inwiefern die Namensgebung von irgendwelchen Funktionen logisch ist, seih mal dahingestellt. Kocht doch eh jeder sein eigenes Süppchen. Irgendwann lernt man halt zwischen Programmiersprachen umzustellen. Ich programmier mal vb.net, mal c#, mal vb6, mal c, mal php, mal asp. Das ganze wenns lustig ist innerhalb von einem Tag und ärger mich auch oft genug herum, warum denn nicht die Befehle überall gleich heißen können.

Aber wie das halt so ist bei Entwicklungen (mal ein wenig extrem ausgedrückt): Da findet man ein Entwickler eine Programmiersprache, arbeitet damit, befindet einige Dinge als schlecht, schreibt sich seine eigene. Und da nimmt er natürlich überall die Befehle die am ehsten einfallen/liegen und nicht die, die schon 100 andere vor ihm verwendet haben. Weil eine neue Sprache muss ja besser und toller und vor allem: anders sein.

Da hilft dann wohl nur noch selber seine eigene Sprache schreiben ;)

[./OT]

however, stay clever :cool:

mfg Thomas

Satan_666 14.12.2004 16:20

Zitat:

Original geschrieben von T.dot
*nipped*

Aber wie das halt so ist bei Entwicklungen (mal ein wenig extrem ausgedrückt): Da findet man ein Entwickler eine Programmiersprache, arbeitet damit, befindet einige Dinge als schlecht, schreibt sich seine eigene. Und da nimmt er natürlich überall die Befehle die am ehsten einfallen/liegen und nicht die, die schon 100 andere vor ihm verwendet haben. Weil eine neue Sprache muss ja besser und toller und vor allem: anders sein.


genau das meine ich: was ist denn besser, wenn ich statt delete beispielsweise unlink schreiben muss? das musst du mir jetzt erklären.... :D


ich habe schon vor vielen, vielen jahren mit enthusiastischen C-programmierern geredet, die sich darauf was eingebildet haben, weil sie statt add 1 to var (beispiel von cobol) die variante var++ schreiben konnten. also, wenn das der vorteil der programmiersprache C sein soll, dann weiß ich nimmer.

besser ist eine sprache meiner meinung nach dann, wenn sie effizienteren code produziert - aber das hat doch absolut nichts damit zu tun, wie die schnittstelle compiler<->mensch aussieht....


Alle Zeitangaben in WEZ +2. Es ist jetzt 04:29 Uhr.

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