Один подход заключается в использовании «магическое число» соглашение, чтобы прочитать первый бит файла.
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 и т. Д. Если кто-то хочет увидеть наш код реального мира, не стесняйтесь связываться со мной здесь.
Спасибо Синан за отличную ссылку! Я не знал, что это было. Спасибо. – sjsc
Команда файла действительно хороша для этого, поэтому эта оболочка должна выполнять эту работу. – tadman