Apache Tika - 不正确的MIME(内容类型)检测

时间:2013-03-02 23:11:15

标签: java apache-tika

我正在尝试将传递给Web服务的文件内容类型检测到SOAP信封中。 该文件可以用两种方式表示:

  • 来自其网址,
  • 来自其contains(base64压缩数据)。

此时,我可以将此文件转换为流缓冲区。 但是,我尝试获取其内容类型失败了。 如果指示了文件扩展名,则检测到内容类型,否则内容始终被检测为“普通/文本”。

贝娄是我的班级代码:

class 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类型?

2 个答案:

答案 0 :(得分:0)

我不认为您可以在没有扩展名的情况下检测mime类型,您需要知道哪个系统正在编写该文件以及期望在哪种文件中并且基于您需要设置MIME类型(我猜你在回复中使用它。)

答案 1 :(得分:0)

你需要确保在发送给Tika之前解码内容,不,绝对不需要扩展,通过这里描述的一个很好理解的mime魔术过程进行检测:https://tika.apache.org/1.1/detection.html