如何确保文件的内容类型是实际内容类型

时间:2017-12-13 07:00:07

标签: java file

我在Java中有一个后端服务,它将文件上传到服务器。但我似乎正在上传一些不需要的文件类型。

对于例如:如果我有一个foo.jpg文件并将其重命名为foo.pdf,那么它就会被上传。如何查看foo.pdf的实际内容 以下是我正在使用的代码

for (Part part : request.getParts()) {
    if (part.getName().startsWith("file")) {
        String filename = part.getHeader("content-disposition");
        filename = filename.replaceFirst("(?i)^.*filename=\"([^\"]+)\".*$", "$1");
        String fileType = part.getContentType();
        DocumentUpload documentUpload = new DocumentUpload();
        documentUpload.setFilename(filename);
        documentUpload.setFileType(fileType);
        documentUpload.setPayload(part.getInputStream());     
        response = documentService.save(documentUpload, uriInfo);
        break;
    }
}

1 个答案:

答案 0 :(得分:2)

您可以使用A pache Tika library.

然后你可以找到这样的实际MIME类型:

public String getMimetype(BaseDocument document) {
    ContentHandler contenthandler = new BodyContentHandler();
    Metadata metadata = new Metadata();
    metadata.set(Metadata.RESOURCE_NAME_KEY, document.getName());
    Parser parser = new AutoDetectParser();
    try {
        parser.parse(new ByteArrayInputStream(document.getFile()), contenthandler, metadata, null);
    } catch (IOException | SAXException | TikaException e) {
        //throw
    }

    return metadata.get(Metadata.CONTENT_TYPE);
}

BaseDocument上面只是一个包含文档信息的自定义对象。

您还可以获得该文件的实际扩展名,如:

public String getExtension(BaseDocument document) {
    TikaConfig config = TikaConfig.getDefaultConfig();
    MediaType mediaType = null;
    MimeType mimeType = null;
    try {
        mediaType = config.getMimeRepository().detect(new ByteArrayInputStream(document.getFile()), new Metadata());
        mimeType = config.getMimeRepository().forName(mediaType.toString());
    } catch (MimeTypeException | IOException e) {
        //throw;
    }

    return mimeType.getExtension();
}