web-dev-qa-db-ja.com

端末からファイルのMIMEタイプを変更するにはどうすればよいですか?

私が探しているのは、file -I(ダーウィン; Linuxでは-i)。

たとえば、次の場合:

$ file -I filename.pdf
filename.pdf: application/octet-stream; charset=binary

私はこのようなことをしたいと思います:

$ [someCommand] filename.pdf application/pdf

その結果、filename.pdfはapplication/pdfとして入力されます。

質問の理由は、Webサーバーが間違ったMIMEタイプを使用することがあり、その結果、プログラムがファイルを開くことを拒否するためです。 (私の経験では、ほとんどの場合テキスト/プレーンです。)

私はman、ウェブ、およびこのサイトを約2時間半検索しています。 16進ダンプからxattr、テキストエディターまで、すべてを試しました。

あなたの助けに感謝します。

クリス

17
curieux

MIMEタイプに関することは、それらがほぼ完全に架空のものであるということです。

MIMEとHTTPは、すべてのファイルに「コンテンツタイプ」を識別するメタデータがあることを装います。ネットワーク経由でファイルを送信すると、「コンテンツタイプ」メタデータが一緒に送信されるため、ファイルのコンテンツを誤解することはありません。

真実は、このメタデータが存在しないということです。 MIMEが発明された頃には、OSベンダーにファイルに新しいタイプシステムを採用するよう説得するのは遅すぎました。 Unixはマジックナンバーに、DOSは3文字のファイル名サフィックスに、そして古典的なMacOSにはクリエーターコードとタイプコードがありました。 (MacOSタイプコードは、実際にはファイル名とコンテンツの両方から分離されていたため、MIMEモデルに最も近いものでした。ただし、4文字しかないため、MIMEタイプは適合しません。)

MIME互換のコンテンツタイプをファイルシステムに保存する人はいません。 MIMEメッセージcomposerまたはHTTPサーバーがファイルを送信する場合、従来の方法でファイルタイプ(ファイル名のサフィックスやマジックナンバー)を決定し、結果をMIMEタイプにマッピングします。

理論(MIMEがファイルタイプの推測を排除する)とは対照的に、実際に実装されたMIMEは、「ファイル名のサフィックスおよび/またはマジックナンバーに基づくファイルタイプの推測」ロジックをファイルの受信者から送信者に移動しました。あなたが気づいたように、送信者は通常、受信者が自分自身でそれを理解することを強制された場合に行うよりも良い仕事をしません。多くの場合、Webサーバーの場合、サーバーがファイルにContent-typeを平手打ちしようとすると事態が悪化します。 Webサーバーが配信するためだけに使用され、そのコンテンツを解釈する必要がない場合、Webサーバーが提供するファイルの形式について何かを知る理由はありません。

fileコマンドは、コンテンツを読み取り、マジックナンバーと文字列を探すことにより、ファイルタイプを推測します。 -Iオプションはそれを変更しません。別の出力形式を選択するだけです。

Webサーバーが特定のファイルに対して送信するContent-Typeヘッダーを変更するには、Webサーバーの構成マニュアルを参照する必要があります。ファイル自体に対してできることは何もありません。

14
user2404501

PDFがあり、$file --mime-typeコマンド応答octet-streamおよびapplication/pdf、ファイルに破損があります。

Pdfリーダーはそれを読み、問題を無視しますが、このファイルをWebアプリケーションにアップロードすると、アプリケーションはmime-typeをオクテットストリームとして認識します。主にmime-typeを検証した場合、それが問題になることがあります(アプリケーションでこの問題が発生することがあります)。

高速な解決策を得るには、次のようなゴーストスクリプトを使用します。

gs -o new.pdf -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress old.pdf
3
Jeff Almeida

「ファイルのMIMEタイプ」について話すのはちょっとした間違いです。「ファイル」にはMIMEタイプがありません。オクテットストリームのみがそれらを持っています(@ wumpus-q-wumbleyのMIMEタイプの説明が「架空」であることに必ずしも同意するわけではありませんが、これは別の考え方です)。

MIMEはMulti-purpose Internet Mail Extensionsの略で、元は RFC 2045 で説明されていました。電子メールメッセージのrestで、すぐに大量のバイトを送信します。これらは(たとえば)HTTPプロトコルで非常に自然に再利用され、このMIMEタイプがヘッダーを形成するHTTP応答のバイトをクライアントがどのように解釈するかをクライアントに理解させます。

fileコマンドがMIMEタイプを表示できるという事実は、ウィンドウシステムがファイルを開くために使用するアプリケーションの名前を検索できるようにするキーとして機能するというアイデアのさらなる拡張を示唆しています。

したがって、「ファイルのMIMEタイプ」が何かを意味する場合、「HTTPリクエストへの応答で配信される場合にWebサーバーがこのファイルの前に付けるMIMEタイプ」(またはそのようなもの)を意味します。そのように考えると、MIMEタイプはWebサーバーの構成の一部であり、ファイルに固有のものではないことは明らかです。単一のファイルは、それを取得するURLとリクエストの詳細に応じてさまざまなMIMEタイプで配信される可能性がありますおよび構成。したがって、XHTMLファイルはtext/htmlまたはapplication/xmlまたはapplication/octet-stream HTTPリクエストの詳細、ファイルのあるディレクトリ、実際には月の満ち欠けに応じて(後者はunhelpfulサーバー設定になります)。

Webサーバーには、このMIMEタイプを決定するための多くのメカニズムがあり、ファイル拡張子に基づいたルックアップテーブル、.htaccessファイル、または実際にfileコマンドの出力。

あなたの質問に対する答えは:it dependです。

  • Webサーバーがこのファイルを配信する方法を変更する場合は、 Webサーバーのドキュメント またはシステムの/etc/mime.typesファイル(システムがそれを使用し、サーバーがそれにフォールバックするように構成されている場合)。
  • 指定した(タイプの)ファイルを開くアプリケーションを変更する場合は、OS/window-managerのドキュメントが役立ちます。
  • 何らかの理由でfileコマンドの出力を明確に変更する必要がある場合は、man fileはあなたの友達です。おそらく、マジックナンバーファイルをかなり慎重に探し回る必要があります。
3
Norman Gray