10

JSFでファイルアップロードを開発しています。アプリケーションは、ファイルに関する 3 つの日付を保存します。

  • ファイル名
  • バイト
  • ブラウザによって送信された Content-Type。

私の問題は、いくつかのファイルが content type = で保存されているapplication/octet-streamこと*.docです*.pdf

ブラウザーはいつそのようなコンテンツ タイプを送信しますか?
データベースをクリーンアップしたいので、ブラウザの情報がいつ間違っているかを知る必要があります。

4

2 に答える 2

9

ブラウザから送信された値を無視します。これは実際、使用するクライアント プラットフォーム、ブラウザ、および構成に依存します。

ファイル拡張子に基づいてコンテンツ タイプを完全に制御したい場合は、ServletContext#getMimeType().

String mimeType = servletContext.getMimeType(filename);

デフォルトの MIME タイプはweb.xml、問題の servletcontainer の で定義されています。たとえば、Tomcat では、/conf/web.xml. /WEB-INF/web.xml次のように、webapp で拡張/オーバーライドできます。

<mime-mapping>
    <extension>xlsx</extension>
    <mime-type>application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</mime-type>
</mime-mapping>

実際のファイルの内容に基づいて MIME タイプを判断することもできます (ファイル拡張子自体は正確ではない可能性があり、クライアントによってだまされる可能性があるため) が、これには多くの作業が必要です。サードパーティのライブラリを使用してすべての作業を行うことを検討してください。これにはJMimeMagicが役立つことがわかりました。次のように使用できます。

String mimeType = Magic.getMagicMatch(file, false).getMimeType();

すべてのMIME タイプを信頼できるものとしてサポートしているわけではないことに注意してください。両方のアプローチの組み合わせを検討することもできます。たとえば、一方が null またはapplication/octet-streamを返す場合は、他方を使用します。または、両方が異なるが「有効な」Mimetype を返す場合は、JMimeMagic によって返されるものを優先します。

ああ、追加するのをほとんど忘れていました.JSFでは、ServletContext次のように取得できます。

ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();

または、すでに JSF 2.x を使用している場合は、ExternalContext#getMimeType()代わりに使用してください。

于 2010-03-11T16:54:39.037 に答える
2

OS、ブラウザ、およびユーザーがそれらをどのように構成したかによって異なります。これは、ブラウザーがローカル ファイルのファイル タイプを (表示するために) 判別する方法に基づいています。ほとんどの OS とブラウザーの組み合わせでは、これはファイルの拡張子に基づいていますが、一部の OS とブラウザーの組み合わせでは、他の方法で決定される場合があります。(例: Mac OS の場合)

いずれにせよ、ブラウザから送信された Content-type に依存するべきではありません。最善の方法は、実際にファイルの内容を確認することです。おそらくファイル名を使用することもできますが、ブラウザは必ずしもそれをうまく伝えるとは限らないことに注意してください (ただし、ブラウザが送信する Content-type よりもはるかに信頼性が高いでしょう)

于 2010-03-11T16:41:04.263 に答える