Un approccio è quello di utilizzare la convenzione "numero magico" per leggere il primo bit di un file.
http://www.astro.keele.ac.uk/oldusers/rno/Computing/File_magic.html
Esempi:
"BM" is a Bitmap image
"GIF8" is a GIF image
"\xff\xd8\xff\xe0" is a JPEG image
esempio in Ruby:
def bitmap?(data)
return data[0,2]=="MB"
end
def gif?(data)
return data[0,4]=="GIF8"
end
def jpeg?(data)
return data[0,4]=="\xff\xd8\xff\xe0"
end
def file_is_image?(filename)
f = File.open(filename,'rb') # rb means to read using binary
data = f.read(9) # magic numbers are up to 9 bytes
f.close
return bitmap?(data) or gif?(data) or jpeg?(data)
end
Perché usare questo anziché l'estensione del nome del file o il modulo filemagic?
Per rilevare il tipo di dati prima di scrivere qualsiasi dato sul disco. Ad esempio, possiamo leggere il flusso di dati di caricamento prima di scrivere qualsiasi dato sul disco. Se il numero magico non corrisponde al tipo di contenuto del modulo web, possiamo immediatamente segnalare un errore.
Implementiamo il nostro codice del mondo reale in modo leggermente diverso. Creiamo un hash: ogni chiave è una stringa di numeri magici, ogni valore è un simbolo come: bitmap,: gif,: jpeg, ecc. Se qualcuno vorrebbe vedere il nostro codice del mondo reale, sentiti libero di contattarmi qui.
Grazie a Sinan per l'ottimo collegamento! Non sapevo che esistesse. Grazie. – sjsc
Il comando file è davvero ottimo per questo, quindi questo wrapper dovrebbe fare il lavoro. – tadman