Newsgroup: it.comp.www.php
Titolo: Estensioni file

Buondi' ;)
Sto scrivendo un piccolo file manager in PHP e ho un problemino: mi
piacerebbe poter visualizzare l'estensione di un file evidenziata, ma
non essendo un genio delle espressioni regolari sarebbe gradita una
mano:
Ho il nome del file:
NOMEFILE.ESTENSIONE
Voglio visualizzare solo ESTENSIONE, in questo formato, poniamo sia
index.php il file:
index.php | File *php* | 123 Kb.
Posso ricavare le ultime tre lettere del nome file con una semplice
substr(), ma non potrei gestire le estensioni con 2 lettere o con 4
(.js per dirne una, o .html)
Ho provato qualche espressione regolare x ricavare la stringa dopo il .
ma non sono un genio come dicevo prima.
Qualcuno puo' darmi una mano?
Grazie a chi mi rispondera' :)
--
Napolux

index.php il file:
Fai un explode e poi prendi l'ultimo pezzo dell'array generato
Francesco Mazzi
Webmaster di AltroPC.it - 
http://www.altropc.it
 
Staff di E-Xoopport - 
http://www.e-xoopport.it

 (.js per dirne una, o .html)
$nomefile = 'pippo.pipp';
$ext = array_pop(explode('.', $nomefile));

, oppure:
$ext = substr(strrchr($filename, "."), 1);
Ciao.
-- 
Federico


OH GESU'
E' talmente semplice che non ci avevo pensato!
Grazie!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 piacerebbe poter visualizzare l'estensione di un file evidenziata,
Non farlo, in Internet il tipo di un file si codifica con MIME, non con
le estensioni di tre lettere.
Ciao,
 ___ 
/_|_\  Umberto Salsi
\/_\/  
www.icosaedro.it

 
Dillo tu al cliente che al posto di jpg deve usare/leggere
image/jpeg
;)
Comunque grazie a tutti x le velocissime e chiarissime risposte ;)
-- 
Napolux
Bombing for peace is like fucking for virginity
http://www.napolux.com
http://napolux.deviantart.com
http://www.blogitaliani.it

 image/jpeg
A livello dell'interfaccia utente puoi mostrare quello che vuoi (cioe',
quello che vuole il cliente :-) ma internamente il programma deve lavorare
per benino. Inoltre se salvi il tipo MIME del file originariamente
inserito, hai automaticamente il tipo MIME corretto e indipendente dalla
piattaforma per fare il dowload e per per includerlo in un email.  Inoltre
il tuo programma e' automaticamente in grado di gestire qualunque tipo
di file, passati presenti e futuri, anche quelli che non avevi previsto.


 > Sto scrivendo un piccolo file manager in PHP e ho un problemino: mi
 > piacerebbe poter visualizzare l'estensione di un file evidenziata,
se può servire io uso:
$fnewname = substr($fname,0,strrpos($fname,".")) . 
($count?("_".$count):"") . strrchr($fname, ".");
dove count viene incrementato solo nel caso in cui esista già un file 
con quel nome... quindi se ho già file.jpg la funzione mi crea 
file_1.jpg etc..etc..
ovviamente va inserita in un loop di verifica...
Umberto Salsi ha scritto:
 > Inoltre
 > il tuo programma e' automaticamente in grado di gestire qualunque tipo
 > di file, passati presenti e futuri, anche quelli che non avevi previsto.
mi interessa molto la cosa...
io mi son fatto un filemanager personale, ma alla fine ho trovato molto 
+ comodo fare un parsing del nome per l'estensione...
ma è certo che lavorare con il MIME sarebbe + corretto..
ma non ho ben capito come funzionerebbe la cosa..
mi potresti dare qualche chiarimento sul metodo?
grazie
ciao
simple_maL

 simple_maL
La discussione interessa anche me ;)
;)

 mi potresti dare qualche chiarimento sul metodo?
Allora, breve decalogo:
UPLOAD
------
1. L'upload dei file via HTTP prevede l'invio di varie informazioni:
il file, il suo nome sul PC client codificato nel charset della pagina
che contiene il FORM (tipicam. ISO-8859-1 oppure, meglio, UTF-8), la
lunghezza del file, il tipo MIME. Tutte queste info il PHP te le mette
in $_FILE[][]. Validare il nome file (lungh. max, rispetto del charset)
e il tipo MIME (solo codici ASCII stampabili, lungh. max ragionevole).
2. Non e' sano salvare i file in un DB, perche' e' roba binaria che non
ha niente a che fare con un DB. Meglio mettere i file nel file system
del server e gli altri dati nel DB. Il nome del file sul file system
del server sara' la chiave primaria (PK) della tabella del DB, cioe'
un banale numero. Nel DB salvi: chiave primaria, nome originale del file
codificato UTF-8, tipo MIME, size, utente che lo ha inviato, categoria,
data di upload, data di scadenza o tempo di senescenza se non interessa
a nessuno, permessi di accesso, eventuale commento che lo descrive,
numero di download, indice di popolarita' o interesse, e quant'altro ti
viene in mente. Come vedi, appoggiandosi a un DB si possono implementare
funzionalita' molto piu' potenti di quelle disponibili in un qualsiasi
file system, ed inoltre si realizza l'indipendenza dal file system
specifico sottostante.
3. Non mettere i file in un'unica directory, ma sparsi in un albero in
modo che ogni dir. contenga al max poche decine di files. Il criterio
di ordinamento potrebbe essere quello della PK. Esempio: se la PK e'
123456789, il file va messo in $FS_BASE/12/34/56/79/9. Questo permette
di raggiungere il file data la PK e viceversa.
4. Se i file devono essere ordinati gerarchicamente, crea una gerarchia
virtuale di directory mantenuta dal DB da presentare all'utente.
Questa gerarchia di dir. non ha nulla a che vedere con la distribuzione
dei file nel file system del server.
5. Tieni i files in una dir. irraggiungibile dal WEB (cioe' fuori dal
DocumentRoot) in modo che puoi disciplinare gli accessi.
6. Per presentare il tipo dei file all'utente, a livello di interfaccia
puoi usare una funzione come questa, che mappa il tipo MIME in qualcosa di
piu' "amichevole":
function MIMEtoHumanReadable($mime)
{
    switch($mime) {
    case "text/plain": return "testo";
    case "text/html":  return "ipertesto";
    case "img/gif":
    case "img/png":
    case "img/bmp: return "immagine per punti";
    case "img/jpeg": return "immagine per punti di qualita' fotografica";
    case "application/postscript": return "documento vettoriale PostScript";
    case "application/msword": return "documento Microsoft Word";
    case "application/zip": return "file compattato";
    case "video/mpeg":
    case "video/quicktime":
    case "video/x-msvideo": return "filmato";
    case "application/octet-string": return "file binario";
    /* ecc. ecc. */
    default:
        trigger_error(__FUNCTION__ . ": missing case for MIME type $mime",
            E_USER_NOTICE);
        return $mime;
    }
}
Come vedi in tutto questo il concetto di "estensione" non compare, e'
solo un artefatto convenzionale inventato dai file system che non hanno
altro modo per classificare il tipo di un file.
C'e' solo un caso nel quale lato server puo' essere necessario
interessarsi della questione delle estensioni, e cioe' quando
il client non fornisce il tipo MIME corretto ma solo il generico
"application/octet-string". Questo potrebbe capitare, ad esempio, quando
l'utente fa l'upload di un file da una macchina che non e' quella dove
il file e' stato prodotto.  In questo caso il server potrebbe (ma non
e' tenuto a farlo) analizzare l'estensione nel tentativo di dedurre
un tipo MIME corretto. Individuato il tipo MIME corretto, il server
dovrebbe informare l'utente e proporre un tipo MIME adatto. Sia pero'
bene inteso che tutto questo e' solo per venire incontro a una carenza
che sta lato client, non lato server. L'onere di indicare il tipo MIME
corretto spetta comunque al browser.
DOWNLOAD
--------
In dowload, tu devi proporre il nome del file originario e il suo
tipo MIME, esattamente come furono indicati all'atto dell'upload. Se
l'estensione non corrisponde al tipo MIME, oppure se l'estensione manca
del tutto, sara' essere il browser a rimediare secondo le convenzioni
del suo file system. Seguono esempi "patologici" nei quali il browser
deve gestire la situazione:
* Se il client scarica "Fattura 4:06 del 4\2\2006.pdf" (nome lecito
su file system Unix ma non su Windows) il browser potrebbe proporre
all'utente un nome alternativo come "Fattura 4-06 del 4/2/2006.pdf"
(nome lecito in Windows, ma non in Unix).
* Se il client scarica un file che si chiama "panorama.jpg" il cui tipo
MIME viene riportato essere "text/plain", allora il browser potrebbe
aprire il file con Notepad e potrebbe proporre all'utente di salvarlo
come "panorama_jpg.txt" per adeguarsi alle convenzioni del file system
sottostante che mappano il tipo MIME nell'estensione.
* Se il file si chiama "virus.exe" e il tipo MIME indicato dal server e'
"image/gif", il client dovrebbe aprirlo come immagine come indicato dal
suo tipo MIME, e non cercare di eseguirlo.
CONCLUSIONI
-----------
Avvalersi dell'informazione sul tipo MIME comporta molti vantaggi:
semplifica il lavoro lato server (non dobbiamo impegolarci con la
questione delle estensioni); rende l'interfaccia piu' semplice e
consistente, demandando al server cio' che e' di sua competenza,
e al client cio' che e' del client; rende il programma piu' longevo
(funzionera' anche con MPEG9); rende il programma indipendente dal file
system del server e del client; rende gli utenti piu' contenti perche'
incontreranno meno problemi; e' conforme ai dettami del protocollo HTTP,
SMTP e di Internet in generale.


 Allora, breve decalogo:
ottimo, ottimo, ottimo...
mi studio un po' la cosa e la implemento prima possibile..
grazie mille
simple_maL