Как извлечь расширение файла из массива байтов
У меня есть массив байтов в базе данных.
Как извлечь расширение файла (mime/type) из массива byte в java?
Ответы
Ответ 1
Если это для хранения загруженного файла:
- создать столбец для расширения имени файла
- создать столбец для типа mime, отправленного браузером
Если у вас нет исходного файла, и у вас есть только байты, у вас есть несколько хороших решений.
Если вы можете использовать библиотеку, посмотрите на использование mime-util для проверки байтов:
http://technopaper.blogspot.com/2009/03/identifying-mime-using-mime-util.html
Если вам нужно создать собственный байтовый детектор, вот несколько наиболее популярных стартовых байтов:
"BC" => bitcode,
"BM" => bitmap,
"BZ" => bzip,
"MZ" => exe,
"SIMPLE"=> fits,
"GIF8" => gif,
"GKSM" => gks,
[0x01,0xDA].pack('c*') => iris_rgb,
[0xF1,0x00,0x40,0xBB].pack('c*') => itc,
[0xFF,0xD8].pack('c*') => jpeg,
"IIN1" => niff,
"MThd" => midi,
"%PDF" => pdf,
"VIEW" => pm,
[0x89].pack('c*') + "PNG" => png,
"%!" => postscript,
"Y" + [0xA6].pack('c*') + "j" + [0x95].pack('c*') => sun_rasterfile,
"MM*" + [0x00].pack('c*') => tiff,
"II*" + [0x00].pack('c*') => tiff,
"gimp xcf" => gimp_xcf,
"#FIG" => xfig,
"/* XPM */" => xpm,
[0x23,0x21].pack('c*') => shebang,
[0x1F,0x9D].pack('c*') => compress,
[0x1F,0x8B].pack('c*') => gzip,
"PK" + [0x03,0x04].pack('c*') => pkzip,
"MZ" => dos_os2_windows_executable,
".ELF" => unix_elf,
[0x99,0x00].pack('c*') => pgp_public_ring,
[0x95,0x01].pack('c*') => pgp_security_ring,
[0x95,0x00].pack('c*') => pgp_security_ring,
[0xA6,0x00].pack('c*') => pgp_encrypted_data,
[0xD0,0xCF,0x11,0xE0].pack('c*') => docfile
Ответ 2
Оказалось, что в классе JDK
URLConnection
есть достойный метод, обратитесь к следующему ответу: Получение типа Mime в Java
Если нужно извлечь расширение файла из байтового массива вместо файла, нужно просто использовать java.io.ByteArrayInputStream
(класс для чтения байтов из байт-массивов) вместо java.io.FileInputStream
(класс для чтения байтов из файлов), как в в следующем примере:
byte[] content = ;
InputStream is = new ByteArrayInputStream(content);
String mimeType = URLConnection.guessContentTypeFromStream(is);
//...close stream
Надеюсь, что это поможет...
Ответ 3
Возможно, мне нужно сохранить дополнительный столбец в моей БД для расширения файла.
Это лучшее решение, чем попытка вывести mimetype на основе содержимого базы данных, по крайней мере, из следующих причин:
- Если у вас есть тип mime из источника документа, вы можете его сохранить и использовать.
- Вы могли бы (потенциально) попросить пользователя указать тип mimetype при отправке документа.
- Если вам нужно использовать некоторую эвристическую схему для определения типа mimetype:
- вы можете выполнить эту работу один раз перед созданием строки таблицы, а не N раз после ее извлечения, и
- вы можете сообщать о случаях, когда эвристика не дает хорошего ответа и может попросить пользователя сказать, какой тип файла действительно.
(Я делаю некоторые предположения, которые могут не оправдаться, но вопрос не дает никаких подсказок о том, как должна работать более крупная система.)