2012-04-06 16 views
14

Mam tablicę bajtów w bazie danych.Jak wyodrębnić rozszerzenie pliku z tablicy bajtów

Jak wyodrębnić rozszerzenie pliku (mime/type) z tablicy bajtów w java?

+0

'bajt array' jest tablicą bajtów i nic więcej.Jeśli masz 'tablicę bajtów' - nie możesz powiedzieć, co jest tam przechowywane. Możesz próbować odgadnąć zawartość tablicy bajtów, ale będzie to tylko zgadywanie. – bezmax

+0

Nie sądzę, mogę to zrobić za pomocą klasy MagicMatch, ale do tego muszę zaimportować zewnętrzny słoik. Szukam czegoś innego. bajt [] data = ... MagicMatch match = Magic.getMagicMatch (dane); String mimeType = match.getMimeType(); – emilan

+0

Co miałem na myśli - nie ma żadnego typu MIME zapisanego w tablicy bajtów w dowolnym miejscu (poza niektórymi typami danych, które ją obsługują). Na przykład, jeśli masz plik 'Hello World.txt' zapisany na tablicy bajtów, masz 11 bajtów:' H, e, l, l, o,, w, o, r, l, d'. Nie ma typu MIME, jak widać. Jaka jest biblioteka 'Magic' - próbuje ** zgadnąć ** typ pliku według zawartości pliku. Podobnie jak oprogramowanie antywirusowe szuka wzorców wirusów, tego rodzaju biblioteki próbują ** domyślać się typu MIME według pewnych określonych wzorców wspólnych dla tych typów MIME. – bezmax

Odpowiedz

10

Jeśli jest to dla przechowywania pliku, który jest przesłane:

  • utworzyć kolumnę dla rozszerzenia pliku
  • utworzyć kolumnę typu MIME jako wysłane przez przeglądarkę

Jeśli nie masz oryginalnego pliku, a masz tylko bajty, masz kilka dobrych rozwiązań.

Jeśli jesteś w stanie korzystać z biblioteki, spójrz na użyciu mime-util do wglądu bajtów:

http://technopaper.blogspot.com/2009/03/identifying-mime-using-mime-util.html

Jeśli trzeba zbudować własny detektor bajtowy, oto wiele z najbardziej popularne bajtów uruchamiania:

"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

Może potrzebuję zapisać dodatkową kolumnę w moim DB dla rozszerzenia pliku.

Jest to lepsze rozwiązanie niż próbując wyprowadzić MIME na podstawie zawartości bazy danych, do (przynajmniej) z następujących powodów:

  • Jeśli masz typ mime ze źródła dokumentu, może przechowywać i używać tego.
  • Użytkownik może (potencjalnie) poprosić użytkownika o podanie typu MIME podczas składania dokumentu.
  • Jeśli trzeba użyć jakiś schemat heurystyczne oparte na zastanawianie się, jak typ MIME: raz przed utworzeniem wiersz tabeli, zamiast N razy po ekstrakcji go
    • można wykonywać pracę, a
    • ci może zgłaszać przypadki, w których heurystyka nie daje dobrej odpowiedzi, i może poprosić użytkownika o określenie typu pliku.

(robię pewne założenia, że ​​nie może być uzasadniona, ale pytanie nie daje żadnych wskazówek, w jaki sposób większy System przeznaczony jest do pracy.)

31

okazało się, że tam jest przyzwoity sposób w JDK „s URLConnection klasy, należy zapoznać się z następującą odpowiedź: Getting A File's Mime Type In Java

Jeśli trzeba wyodrębnić rozszerzenie pliku z tablicy bajtów zamiast z pliku, należy po prostu użyć java.io.ByteArrayInputStream (klasa do czytania bajtów specjalnie z tablic bajtów) zamiast java.io.FileInputStream (klasa do czytania bajtów z plików), jak w poniższym przykładzie:

byte[] content = ; 
InputStream is = new ByteArrayInputStream(content); 
String mimeType = URLConnection.guessContentTypeFromStream(is); 
//...close stream 

Nadzieja to pomaga ...

+0

Pomocne tylko, jeśli można zapisać zawartość tablicy bajtów do pliku, a następnie przeczytać ją ponownie, co nie było częścią pierwotnego pytania. (Jestem w tej samej sytuacji.) – jmkgreen

+7

Nie, nie, to rozwiązanie działa z dowolnym strumieniem bajtów - proszę odnieść się do mojej edytowanej odpowiedzi. W Javie 'InputStream' jest abstrakcją ponad' cokolwiek, od czego bajty mogą być odczytywane', więc kiedy gdzieś 'InputStream' jest potrzebny - to tylko kwestia znalezienia poprawnej implementacji' InputStream'. – Yura

+0

Pracowałem jak wdzięk, dzięki! – MSwezey

Powiązane problemy