web-dev-qa-db-ja.com

MIMEの検出方法

私は周りを検索しましたが、トピックに関する情報を見つけることができないようです。

既存のファイルのMIMEタイプをどのように設定しますか?

たとえば、タイプtext/htmlのファイルを作成しようとしています

1
Anonymous

MIMEタイプは実際にはファイルシステムに保存されません。それらは、ファイルの処理方法を知る便利な方法にすぎません。 MIMEタイプを取得するには、プログラムを実行する必要があります。

一部のプログラムは、ファイル拡張子だけでファイルのmimeタイプを検出しますが、他のプログラムはマジックナンバーまたは特殊マジックパターン(本質的には 正規表現 )。


例として、空のファイルを作成する_touch test.html_を実行します。

次に、_xdg-mime query filetype test.html_または_mimetype test.html_を実行します。両方とも_text/html_型を返します。

ただし、_file --mime-type -b test.html_を実行すると、_inode/x-empty_が返されます。


したがって、すべてのプログラムがファイルに対して同じように動作するようにするには、ファイルは正しい拡張子(データ)と正しい拡張子を持っている必要があります。

マジックナンバーとは?

プロファイルイメージで_xxd image | head -1_を実行すると、次のような出力が作成されます。

_00000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR_

Wikipedia によると、_89 50 4E 47 0D 0A 1A 0A_はすべての_image/png_ファイルの標準ヘッダーです。

ファイルコマンドはどのように機能しますか?

file(1) manページから:

この順序で実行されるテストには、ファイルシステムテスト、マジックテスト、言語テストの3つのセットがあります。 ...

ファイルシステムのテストは、 stat(2) システムコールからの戻り値を調べることに基づいています。プログラムは、ファイルが空かどうか、または何らかの特殊ファイルかどうかを確認します。 ...

マジックテストは、特定の固定形式のデータを含むファイルをチェックするために使用されます。 ...これらのファイルには、ファイルの先頭近くの特定の場所に「マジックナンバー」が保存されており、UNIXオペレーティングシステムにファイルがバイナリ実行可能ファイルであり、そのいくつかのタイプがどれであるかを伝えます。 ...ファイルがマジックファイルのエントリのいずれとも一致しない場合、テキストファイルのように見えるかどうかが調べられます。 ...

リストされている文字セットのいずれかで書き込まれたと識別できないファイルは、単に「データ」と呼ばれます。

ファイルはどのマジックパターンを使用するかをどのように知るのですか?

繰り返しますが、 file(1) manページから:

これらのファイルを識別する情報は、コンパイルされたマジックファイル_/usr/share/misc/magic.mgc_、またはコンパイルされたファイルが存在しない場合はディレクトリ_/usr/share/misc/magic_のファイルから読み取られます。さらに、_$HOME/.magic.mgc_または_$HOME/.magic_が存在する場合は、システムマジックファイルよりも優先して使用されます。/etc/magicが存在する場合、他のマジックファイルと一緒に使用されます。

_strace file image |& grep magic_を実行すると、fileコマンドがこれらのファイルを探すことがわかります。

/usr/lib/x86_64-linux-gnu/libmagic.so.1 => libmagic(3) 〜/ .magic.mgc
〜/ .magic
/etc/magic.mgc
/etc/magic
/usr/share/misc/magic.mgc

他のプログラムが使用する_/etc/mime.types_のような他のファイルがあります。このファイルは、MIMEタイプに拡張子を割り当てます。たとえば、_grep -i text/html /etc/mime.types_は以下を生成します。

_text/html                   html htm shtml
_
2
Ravexina