Newsgroup: it.comp.www.php
Titolo: [upload] .mp3: si / .MP3: no (bah!)

ciao a tutti,
mi sto un attimo rincoglionendo? :-/
da una form normalissima per l'upload devo caricare un file mp3.
faccio un controllo sul tipo del file usando:
if ( $_FILES['mp3file']['type'] == "audio/x-mp3" ) ....
poi faccio stampare a video il tipo del file.
se il nome del file da uploadare finisce con .mp3 ricevo:
<<< audio/x-mp3 >>>
che e' giusto.
se invece, mariannacanaintremotataschifosasganciatreni, il file finisce
con .MP3 ricevo:
<<< application/octet-stream >>>
eh??????
il file e' sempre quello! cambia solo che l'estensione e' tutta in
maiuscolo!
umh....sgrat...sgrat.... dove sbaglio?

 umh....sgrat...sgrat.... dove sbaglio?
Non usare il content-type per fare i controlli sull'input.
-- 
I am what I am, I do what I can
Sei un newbie? Leggi questo 
http://url.repository.biz/go/3C
Vuoi supportarmi? 
http://url.repository.biz/go/3E
Do. Or do not. There is not try.

lowercase($ext) == "mp3"

 
Sbagli a fidarti del content-type settato dal browser, che decide lui in 
maniera non sempre molto affidabile che roba è quel file che stai 
cercando di fargli uploadare...
-- 
Fabrizio "Hermooz" Ermini

 Non usare il content-type per fare i controlli sull'input.
ma se non uso il content-type sono costretto a usare l'estensione, che
potrebbe anche essere truffaldina, no?
se rinomino un file.txt in file.mp3, faccio l'upload di un file.txt che
"non deve stare la'".
:-/
altre soluzioni?

 cercando di fargli uploadare...
gia' e si vede.
io, per altro, uso firefox.
:-(

 altre soluzioni?
tecniche, no (almeno non perfette: qualunque controllo formale sui file 
può sempre essere eluso da un utente smaliziato). Difenditi con 
disclaimer, policy d'uso, ecc. ecc.
-- 
Fabrizio "Hermooz" Ermini

 disclaimer, policy d'uso, ecc. ecc.
mi e' venuta in mente una cosa, che pero' vale solo con gli mp3.
qualche giorno fa' setec mi ha segnalato una classe php per accedere ad
alcune info sui file mp3 (bitrate, durata ecc...)
ho provato ad usarla su di un file non mp3 e, naturalmente, ho ottenuto
risultati nulli.
potrei usarla anche in questo caso e sottoporre il file in upload a questa
classe: se ottenessi risultati nulli significherebbe che o la classe fa
cilecca :-) oppure non si tratta di un mp3.
o no?

 cilecca :-) oppure non si tratta di un mp3.
Io piuttosto aprirei il file e controllerei i primi due byte. Se e` un
mp3 sono (in esadecimale) "ff fb" (255 e 251 in decimale).
E` il principio dei "magic numbers" :)
Bye.

 E` il principio dei "magic numbers" :)
umh... ecco, adesso sono un po' fuoristrada.
lo apro con readfile?
controllo i primi due byte con substr?
non ho molto chiaro come dovrei farlo, pardon :-/

 lo apro con readfile?
Non c'e` solo readfile... :)
$f = fopen("file", "rb"); // apre il file in binario
$b = fread($f, 2); // legge due byte
fclose ($f); // chiude il file
if ($b == "\xff\xfb") { // confronta i due byte col magic-number
	e` un mp3
} else {
	e` qualcos'altro
}
Bye.

 }
umh... ho messo a video $b, ed ho notato, con o senza tag ID3 (quando
c'e' il tag i primi due bytes sono "ID"), che non ottengo mai "ff fb".
mannaggina
:-/

 c'e' il tag i primi due bytes sono "ID"), che non ottengo mai "ff fb".
anzi, ora che ci faccio caso ricevo sempre "ÿû" come primi due bytes, a
meno che:
1) ci sia il tag ID3
2) non sia un mp3 "incompleto" (ad es. rippato male, ma che un mp3-player
puo' riprodurre lostesso)
:-(

 puo' riprodurre lostesso)
Allora, mi sono preso le specifiche dell'mp3, e stando a quello, i primi
12 bit sono 0xfff = 111111111111, poi due bit di versione (10 = mpeg2,
11 = mpeg1, 00 = mpeg2.5) quindi 2 bit di layer (11=layer1, 10=layer2,
01=layer3), e qui finiscono i primi 2 byte.
Potresti metterli in OR logico con 0000000000001111 = 0x000f per vedere
se i primi 12 bit sono a 1:
if ($b | 0x000f) { e` un mp3 }
Per quelli che hanno ID come primi due caratteri, o sono fuori standard
o non sono mp3.
Bye.

 o non sono mp3.
grazie mille per le info :-)
pero' scusa l'insolenza: ho provato col solito file, prima con tag id3v2 e
dopo senza tag: nel primo caso ottendo "ID" nel secondo "ÿû", quindi non
e' fuori standard.
ad ogni modo, purtroppo non saro' io a tirar su gli mp3 e non so che
genere di "strani caratteri" :-) conterranno i files. la casistica che non
siano files "conformi" mi manda in palla tutte le eventualita'.
e' gia' come esserci: "senti tu, ho tirato su un mp3 che ascolto da mesi e
il tuo programmello piaccapi' me lo risputa indietro: come mai???"
:-/
ad es. file mp3 "troncati" e non conformi, ma pur riproducibili...
per cui penso che usero' la classe per accedere ad uno dei valori e se
tale valore non e' nullo significa che ho un mp3. :-/
c'e' da dire che ho provato con degli mp3 non conformi (ma riproducibili)
e la classe sta andando bene.

 tale valore non e' nullo significa che ho un mp3. :-/
OK, ma occhio a cosa controlli. Per esempio il Genere 0 (nullo) e`
Blues. Pero` non so come funzioni la classe. Fatti un po' di
esperimenti.
Bye.
 

 Pero` non so come funzioni la classe. Fatti un po' di esperimenti.
ah, la classe e' una vera figata!
anche se io la uso al 2% :-P
eccola qui:
http://www.phpclasses.org/browse/package/640.html

 altre soluzioni?
Se sei in ambiente linux, puoi fare una system al programma 'file'
-- 
Ciao,
 Fabrizio
=== 
http://www.negusweb.it
 ===

 :-)
        ahia, se poi l'mp3 che uppi è incompleto magari non ha durata...