2012-03-06 3 views
0

ファイルアップロード時に、私はこのコードを持って予想されていないとしてコンテンツタイプは、以前はうまくいきましたが、今は正しく動作していない理由を理解できませんでした。コンテンツタイプは、Excelが

+0

*何よりも前に正常に動作しましたか? – pap

+0

@pap私は彼らがしばらく前にうまくいったと言われましたが、私はちょうどプロジェクトで作業を始めました... –

答えて

2

クライアント側の問題です。 UploadedFile#getContentType()は、クライアントがmultipart/form-data部分のContent-Typeヘッダーフィールドで送信したものを返します。明らかに問題のクライアントには、アップロードされたファイルのファイル拡張子に関連付けられたMIMEタイプはありません。これは、クライアントにMS Excelがインストールされていない場合に発生します。

あなたはサーバーであるため、ファイル拡張子に基づいてExternalContext#getMimeType()、または古代のJSF 1.xの場合はServletContext#getMimeType()でMIMEタイプを判別することもできます。

String filename = FilenameUtils.getName(uploadedFile.getName()); // This is available by Commons IO which you should already have. 
String mimetype = FacesContext.getCurrentInstance().getExternalContext().getMimeType(filename); 
// ... 

MIMEタイプ情報はweb.xml<mime-mapping>エントリから取得されます。 servletcontainerは、独自のデフォルトのweb.xml(例えば、Tomcatの場合は、/confフォルダにあります)の全体リストを持っています。

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

注この検出は純粋に、ファイルの拡張子ではなく、ファイルの内容に基づいていること:あなたはXLSXために、次のようにそれはあなたのWebアプリケーションの独自のweb.xmlなどに上書き/拡張することができます。これにより、クライアントがファイル拡張子を編集したときに誤検出を防止することはできません。最も信頼できるのは、Apache POIやJExcelAPIのような実際のExcelファイルパーサを使って解析し、解析中に例外がスローされないかどうかをチェックすることです。

+0

私はすでにそれを修正する方法に答えています。結局のところ、クライアント特有のデータに頼ったことはありません。また、あなたのウェブページの訪問者のすべてがMS Officeをインストールしているとは決して想像してはいけません。愚かな間違い、教訓、学び、弾を噛んで、今修正して次回のことを覚えておいてください。起こることができる:)幸運。 – BalusC

関連する問題