26

データベースにバイト配列があります。

Javaのバイト配列からファイル拡張子(mime / type)を抽出する方法は?

4

3 に答える 3

47

JDKのクラスにはまともなメソッドがあることが判明しましURLConnectionた。次の回答を参照してください。JavaでファイルのMimeタイプを取得する

次の例のように、ファイルではなくバイト配列からファイル拡張子を抽出する必要がある場合は、(ファイルからバイトを読み取るクラスjava.io.ByteArrayInputStream)の代わりにjava.io.FileInputStream(バイト配列からバイトを読み取るクラス)を使用する必要があります。

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

お役に立てれば...

于 2012-11-09T11:15:57.883 に答える
14

これがアップロードされたファイルを保存するためのものである場合:

  • ファイル名拡張子の列を作成します
  • ブラウザから送信された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
于 2012-04-06T07:59:11.820 に答える
2

たぶん、ファイル拡張子のためにDBに追加の列を保存する必要があります。

これは、(少なくとも)次の理由から、データベースのコンテンツに基づいてmimetypeを推測するよりも優れたソリューションです。

  • ドキュメントソースからのmimeタイプがある場合は、それを保存して使用できます。
  • (潜在的に)ユーザーがドキュメントを提出するときにmimetypeを指定するようにユーザーに依頼することができます。
  • mimetypeを理解するためにヒューリスティックベースのスキームを使用する 必要ある場合:
    • テーブル行を抽出した後、N回ではなく、テーブル行を作成する前に1回作業を行うことができます。
    • ヒューリスティックが適切な答えを与えない場合を報告し、ファイルタイプが実際に何であるかをユーザーに尋ねることができます。

(私は保証されないかもしれないいくつかの仮定をしていますが、質問はより大きなシステムがどのように機能することを意図しているかについての手がかりを与えません。)

于 2012-04-06T07:45:02.790 に答える