2

Java のキューからファイルを取得します。次の形式の場合があります。

  1. docx
  2. pdf
  3. 文書
  4. xls
  5. xlsx
  6. TXT
  7. RTF

拡張子を読み取った後、それらが実際にこれらの種類のファイルであるかどうかを検証したいと思います。

たとえば、ファイルを取得し、拡張子が .xls であることを確認しました。その後、それが実際に .xls ファイルなのか、それとも誰かが拡張子を変更して他の形式のファイルをアップロードしたのかを確認したいと思います。

編集:拡張子ではなく、実際に内容を確認して、ファイルの MIME タイプを確認したいと思います。それはどのように行うことができますか?

4

2 に答える 2

3

これはあなたが解決すべき問題ではないと思います。この問題に対する解決策は、脆弱であり、特定の種類の有効なファイルを構成するものについての現在の理解に基づいています。

たとえば、XLS ファイルを取り上げます。そのようなファイルを開くときに Excel が何を受け入れるかを確実に知っていますか? 今後のリリースで、異なるエンコーディング スタイルをサポートする可能性のある変更について、常に最新の状態に保つことができますか?

ユーザーが間違ったタイプのファイルをアップロードした場合、さらに悪いことは何ですか? おそらく、そのファイル拡張子を処理するアプリケーションにファイルを渡すと、エラーが発生するでしょうか? 問題ありません。それをユーザーに渡すだけです。

于 2012-11-06T11:26:07.257 に答える
2

外部ライブラリを使用しない場合:

MimetypesFileTypeMapを使用してファイルmimetypeを取得できます。

    File f = new File(...);
    System.out.println(new MimetypesFileTypeMap().getContentType(f));

次の場合にも同様の結果を得ることができ ます。URLConnection.guessContentTypeFromName これらのソリューションはどちらも、ドキュメントによると、拡張子のみを確認します。

より良いオプション:URLConnection.guessContentTypeFromStream

    File f= new File(...);
    System.out.println(URLConnection.guessContentTypeFromStream(new FileInputStream(f)));

これは、ファイルの最初のバイトから推測しようとします-これは推測にすぎないことに注意してください-ほとんどの場合は機能することがわかりましたが、いくつかの明らかなタイプを検出できません。

両方の組み合わせをお勧めします。

于 2012-11-06T09:54:25.880 に答える