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

Posted

技术标签:

【中文标题】如何确保文件的内容类型是实际的内容类型【英文标题】:How to make sure the content type of a file is the actual content type 【发布时间】:2018-05-27 00:02:53 【问题描述】:

我有一个 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;
    

【问题讨论】:

你想在服务器上检查你得到的字节是否真的是指定的文件类型? 从 http 请求中获取文件类型意味着您信任浏览器。如果您需要更多控制,您可以将文件保存到临时文件,然后尝试按内容识别它的类型。这里有很多相关的问题,例如***.com/questions/9738597/… 【参考方案1】:

您可以使用Apache 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();

【讨论】:

以上是关于如何确保文件的内容类型是实际的内容类型的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中明确检查请求内容类型是不是与实际内容匹配?

在java中确定文件的实际内容类型[重复]

如何获取 NSItemProvider 提供的实际数据/内容而不是类型

创建新内容类型时出错。请确保在尝试单独迁移应用程序之前迁移内容类型

无法解析请求正文。确保请求正文与指定的内容类型匹配:应用程序/json [重复]

Django 内容类型究竟是如何工作的?