Newsgroup: it.lavoro.professioni.webmaster
Titolo: Nomi creati dinamicamente per immagini

Ciao a tutti, vi dico subito che sto cercando anche su Internet, ma spero di 
trovare delle risposte anche da qualcuno più esperta di me che scrive qui.
Scusate quindi nell'eventualità che poi trovo tutte le mie risposte su 
Internet se vi ho disturbati.
Il problema è: immaginate un foto album, faccio l'upload di 10 immagini da 
mettere in una categoria, una volta fatto l'upload ad ogni singola immagine 
associo un titolo del tipo "Un'altro mio amico".
L'immagine viene rinominata sull'hardisk del server linux con file system 
ext2 che consente fino a 255 caratteri compreso punto ed estensione, 
correggetemi dove sbaglio.
Il nome diventa "id_nome.estensione". Dove: id è di un numero imprecisato di 
caratteri, a seconda della grandezza, anzi... un numero massimo preciso ce 
l'ha è che ora non ricordo o non sto a fare calcoli, se qualcuno di voi lo 
sa a memoria può correggermi, campo BIGINT del database MySQL. Il "nome" è 
il titolo che ho dato all'immagine "Un'altro mio amico", trasformato così 
"un_altro_mio_amico", più in fondo l'estensione...
Ok e fin qui ci siamo... ora quello che non riesco e non so io è quali 
caratteri sono permessi e come eventualmente trasformarli... mi spiego 
meglio se non avete già compreso...
Da ftp ho provato a copiare un immagine sul server e a rinominarla usando 
tutti i possibili caratteri.
Lo so forse è un metodo da ignorante... fatto sta che da ftp mi ha 
rinominato il file con tutti i caratteri che mi venivano in mente sulla 
tastiera, compresi % £ ? | etc etc... unici caratteri che non mi prende \ e 
/.
Bene allora pesnavo evito questi due caratteri e sono a posto... è no... 
perchè se richiamo l'immagine chiamata che ne so 12_&|£.jpg da browser 
magari non me la fa vedere...
Allora poi ripensavo anche a quando dei nomi con gli spazi vengono 
trasformati in tipo un%20%amico.jpg o sbaglio?
Insomma... non mi è chiaro come funziona la cosa... io uso php su questo 
sito come linguaggio lato server e stavo già pensando a come fare una 
preg_match che mi sostituisca tot caratteri... però spero forse di non 
sbagliarmi... sento che come dire forse sto facendo un'idiozia perchè è 
molto più semplice... non c'è un altra funzione o... semplicemente non so io 
come vengono rappresentati certi caratteri speciali sull'url e c'è una 
funzione per trasformarli automaticamente no?
Spero che ci sia qualcuno che possa aiutarmi... altrimenti scusate se vi ho 
disturbati per cose che probabilmente per la maggior parte di voi sono ovvie 
e vi irrita sentirvele chiedere.
Ciao e grazie a tutti ancora! 

 caratteri sono permessi e come eventualmente trasformarli...
In Unix un nome di file e' una sequenza di uno o piu' byte qualsiasi,
escluso lo 0 (che marca la fine del nome) e il 47 (che e' lo '/' che
separa i path).  I nomi "." e ".." sono speciali. Quindi l'algoritmo
per la validita' di un nome di file e'
1. vietati i caratteri di codice 0 e 47, che andranno trasformati in
   altro;
2. vietati i nomi "." e "..".
Il file system ignora la codifica del charset, sicche' non e' possibile
stabilire se un nome di file dato usa l'ISO-8859 piuttosto che l'UTF-8.
Questa e' una scelta di implementazione. Consiglierei l'UTF-8 per la sua
generalita', ma purtroppo il PHP e' un po' deboluccio nel gestire l'UTF-8,
per cui nella pratica ripiegherei su di un piu' tradizionale ISO-8859-15.
Cio' implica che tutte le pagine WEB che fai devono usare questa codifica.
La pratica puo' essere completamente diversa. Io eviterei del tutto di
salvare nei nomi dei file stringhe inventate dagli utenti. Meglio salvare
i nomi in un DB e usare la chiave primaria come none del file. Se proprio
vuoi mettere un nome sensato al file, fai una white list dei caratteri
ammessi: lettere, cifre e poco altro.
Attenzione alle estensioni: io posso fare l'upload di una "immagine"
JPEG (tipo MIME image/jpeg) usando come nome di file "foto.exe". Ti
lascio immaginare le conseguenze.
Ciao,
 ___ 
/_|_\  Umberto Salsi
\/_\/  
www.icosaedro.it

Scusate... stavo cercando un po' e... cercando di apprendere quanto più 
possibile sulla codifica url...
Stavo pensando adesso... non è che ho fatto un romanzo per niente e mi basta 
usare due funzioni di php?
http://it.php.net/manual/en/function.urlencode.php
Del tipo $nome_immagine = $id_immagine + 
htmlentities(urlencode($titolo_immagine)) + "." + $estensione_immagine
Spero che non prendiate troppo la cosa come ot da porre sul newsgroup 
relativo a php ma... era per andare avanti e finire il discorso...
sto cercando di capire se devo usare queste funzioni e se le devo usare 
entrambe o solo urlencode...
grazie a chi mi aiuterà e le mie scuse a chi viene disturbato dalle mie 
domande 

 ha scritto nel messaggio 
news:cn7je1$dug$1...@lacerta.tiscalinet.it...

Sto pensando di usare semplicemente un
$nome = preg_replace("/\W/", "_", $nome);
è una soluzione stupida?
Ne esistono di migliori? 

 lascio immaginare le conseguenze.
Si può controllare questo verificando, prima di salvarlo, se il file è 
effettivamente un JPG?
Ciao,
Mett

mett <me...@mett.invalid> wrote:

Non so, magari tentando con GetImageSize() o usando un programma esterno
come il convert di ImageMagick: se ne risulta un errore forse non e' un
JPEG. Pero' questo espone il server a eventuali bug delle varie librerie,
l'ultimo e' stato quello sulle PNG. E' difficile concepire una soluzione
valida per ogni formato di file, dalle immagini ai testi PDF.
In teoria: se il client mi invia un certo file con un certo tipo MIME,
quello e' qualunque sia il nome e l'estensione. Da nessuna parte sta
scritto che il tipo di un file debba per forza essere implicito dal suo
nome. Quei sistemi operativi che usano la convenzione delle estensioni per
codificare il tipo (cioe' praticamente tutti eccetto il vecchio MacOS 9)
dovranno usare le opportune precauzioni. Ad esempio, se un browser su
Windows riceve dal server un file di tipo MIME "image/jpeg" e di nome
"foto.exe" dovrebbe ricodificare il nome secondo le sue convenzioni,
ad esempio "foto.exe.jpg".
In pratica: se devo salvare il nome del file originario, allora faccio una
funzione di validazione che impone una estensione convenzionale, in modo
da proteggere chi lo scarichera'. Altrimenti il nome del file lo ignoro.
