ブラウザから送信された値を無視します。これは実際、使用するクライアント プラットフォーム、ブラウザ、および構成に依存します。
ファイル拡張子に基づいてコンテンツ タイプを完全に制御したい場合は、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()
代わりに使用してください。