Один из подходов заключается в использовании соглашения о «магическом числе» для чтения первых битов файла.
http://www.astro.keele.ac.uk/oldusers/rno/Computing/File_magic.html
Примеры:
"BM" is a Bitmap image
"GIF8" is a GIF image
"\xff\xd8\xff\xe0" is a JPEG image
Пример в 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
Зачем использовать это вместо расширения имени файла или модуля filemagic?
Для определения типа данных перед записью любых данных на диск. Например, мы можем прочитать поток данных загрузки, прежде чем записывать какие-либо данные на диск. Если магическое число не соответствует типу содержимого веб-формы, мы можем немедленно сообщить об ошибке.
Мы реализуем наш реальный код немного по-другому. Мы создаем хеш: каждый ключ является строкой с магическим числом, каждое значение является символом, подобным: bitmap,: gif,: jpeg и т. Д. Если кто-то захочет увидеть наш реальный код, не стесняйтесь связаться со мной здесь.