1

Web サービスに渡されたファイル コンテンツ タイプを SOAP エンベロープで検出しようとしています。このファイルは、次の 2 つの方法で指定できます。

  • そのURLから、
  • その内容から (base64 圧縮データ)。

この時点で、このファイルをストリーム バッファに変換できます。しかし、そのコンテンツタイプを取得しようとする試みはすべて失敗しました。ファイル拡張子が示されている場合、コンテンツ タイプが検出されます。それ以外の場合、コンテンツは常に「プレーン/テキスト」として検出されます。

以下は私のクラスコードです:

クラス MetadataAnalyser {

private InputStream _is;

private File _file;

private void initializeAttributes() {

    _is = null;
    _file= null;

}


private void createTemporaryFile(byte[] pData) {

    FileOutputStream fos = null;
    try {
        _file = File.createTempFile(
                UUID.randomUUID().toString().replace("-", ""),
                null,
                new File("C:\\Users\\Florent\\Documents\\NetBeansProjects\\ServiceEdition\\tmp"));
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        fos = new FileOutputStream(_file);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    try {
        fos.write(pData);
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        fos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

    _file.deleteOnExit();

}

public MetadataAnalyser(byte[] pData) {

    initializeAttributes();
    _is = new ByteArrayInputStream(pData);
    createTemporaryFile(pData);

}

public MetadataAnalyser(InputStream pIs) {

    initializeAttributes();
    _is = pIs;
    _file = null;

}

public MetadataAnalyser(File pFile) {

    initializeAttributes();
    try {
        _file = pFile;
        _is = new FileInputStream(_file);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

public MetadataAnalyser(String pFile) {

    initializeAttributes();
    try {
        _file = new File(pFile);
        if (_file.exists()) {
            _is = new FileInputStream(_file);
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

public String getContentType() {

    AutoDetectParser parser = null;
    Metadata metadata = null;
    InputStream is = null;
    String mimeType = null;

    parser = new AutoDetectParser();
    parser.setParsers(new HashMap<MediaType, Parser>());
    metadata = new Metadata();
    if(_file != null) {
        metadata.add(TikaMetadataKeys.RESOURCE_NAME_KEY, _file.getName());
    }
    try {
        is = new FileInputStream(_file);
        parser.parse(is, new DefaultHandler(), metadata, new ParseContext());
        mimeType = metadata.get(HttpHeaders.CONTENT_TYPE);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (SAXException e) {
        e.printStackTrace();
    } catch (TikaException e) {
        e.printStackTrace();
    } finally {
        return mimeType;
    }

}

}

では、ファイル拡張子が不明な場合でも MIME タイプを検出するにはどうすればよいでしょうか。

4

2 に答える 2

0

コンテンツが Tika に送信される前にデコードされていることを確認する必要があります。拡張子はまったく必要ありません。検出は、ここで説明されているよく理解されている MIME マジック プロセスを介して行われます: https://tika.apache.org/1.1/detection .html

于 2015-12-24T05:39:26.940 に答える
0

拡張子なしで MIME タイプを検出できるとは思いません。ファイルを書き込んでいるシステムとそこにあると予想されるファイルの種類を知る必要があり、それに基づいて MIME タイプを設定する必要があります(あなたの応答でそれを使用しています)。

于 2013-03-02T23:22:00.440 に答える