ブラウザはいつ application/octet-stream を Content-Type として送信しますか?
-
19-09-2019 - |
質問
JSFを使用したファイルアップロードを開発しています。アプリケーションはファイルに関する 3 つの日付を保存します。
- ファイル名
- バイト
- ブラウザによって送信された Content-Type。
私の問題は、一部のファイルがコンテンツ タイプ = で保存されていることです。 application/octet-stream
たとえそうであったとしても *.doc
ファイル順序 *.pdf
.
ブラウザはいつそのようなコンテンツ タイプを送信しますか?
データベースをクリーンアップしたいので、ブラウザー情報がいつ間違っているかを知る必要があります。
解決
ブラウザによって送信された値を無視します。これは、実際に使用されるクライアントプラットフォーム、ブラウザや設定に依存します。
あなたは、ファイルの拡張子に基づいて、コンテンツタイプを完全に制御したい場合は、そして、より良い<のhref = "http://java.sun.com/javaee/5/docs/api/javax/servlet/を使用して、それを自分で決めますServletContext.html#のgetMimeType%28java.lang.String%29" のrel = "nofollowをnoreferrer"> ServletContext#getMimeType()
の。
String mimeType = servletContext.getMimeType(filename);
デフォルトのMIMEタイプは、問題のservletcontainerのweb.xml
にdefiniedされています。例えばTomcatのでは、それが/conf/web.xml
に位置しています。あなたは次のようにWebアプリケーションの/WEB-INF/web.xml
に上書き/拡張することができます:
<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タイプをサポートしていないことに注意してください。また、両方のアプローチの組み合わせを考えることができます。例えば。 1がnullまたはapplication/octet-stream
を返した場合、他を使用しています。両者が異なるが「有効」のMIMEタイプを返した場合や、JMimeMagicによって返されたものを好むます。
ああ、私はほとんど次のようにJSFにあなたがServletContext
を得ることができ、追加するのを忘れます:
ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
それとも、すでにJSF 2.xのを使用するために起こる場合は、<のhref = "http://docs.oracle.com/javaee/6/api/javax/faces/context/ExternalContext.html#getMimeType%28javaを使用代わり%29" REL = "nofollowをnoreferrer"> ExternalContext#getMimeType()
に.lang.String。
他のヒント
これは、OS、ブラウザ、そしてどのようにユーザーがそれらを構成しているに依存します。これは、ブラウザがローカルファイル(それらを表示する)のファイルタイプを決定方法に基づいています。ほとんどのOS /ブラウザの組み合わせで、これはファイルの拡張子に基づいているが、一部には、他の手段によって決定することができます。 (例:MacのOS上)
AY場合、あなたは本当に、ブラウザによって送信されたコンテンツタイプに頼るべきではありません。最善のアプローチは、実際にはファイルの内容を見ることであろう。おそらく、また、ブラウザは、必ずしも、彼らが送るコンテンツタイプよりもどちらか(それはおそらくまだの多くのですが、より信頼性の高いことを伝える程度の良いことを行っていないことのファイル名を使用しますが、心に留めておくことができ)。