multipart文件上传检查java中的mime类型

时间:2018-05-29 07:08:55

标签: java spring-mvc file-upload mime-types

我正在使用mimeutil来检查文件的mimetype。 并且只允许csv和json文件。但是为json文件获取此mimetype “application / x-ipynb + json”mime类型无处可寻。如果还将一个exe文件重命名为json,出于安全原因不应该被允许,任何帮助将被理解为获取文件的确切mime类型。 请参考以下代码以供参考:

public static String verifyExtension(MultipartFile File){
String mimeType = null;
        MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
        MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.ExtensionMimeDetector");
        //MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.OpendesktopMimeDetector");
        MimeUtil.registerMimeDetector(System.getProperty("os.name").startsWith(
              "Windows") ? "eu.medsea.mimeutil.detector.WindowsRegistryMimeDetector"
              : "eu.medsea.mimeutil.detector.OpendesktopMimeDetector");

        Collection<?> mimeTypes = null;
        try {
            mimeTypes = MimeUtil.getMimeTypes(File.getBytes());
            if(mimeTypes.equals("application/vnd.ms-excel") || mimeTypes.equals("application/json") 
                    || mimeTypes.equals("application/octet-stream"))
            {
                System.out.println("File typ is csv or json");
                mimeType = "success";
            }else{
                mimeType = "fail";
            }
        } catch (MimeException e1) {
            System.out.println(e1.getMessage());
            mimeType = "fail";
        } catch (IOException e1) {
            System.out.println(e1.getMessage());
            mimeType = "fail";
        }
}

1 个答案:

答案 0 :(得分:0)

您的问题是java中的MIME类型检查是基于文件扩展名的。

要运行实际文件分析,请尝试Apache Tika Mime Magic Detection

此外,您可以尝试以下方法之一:

  1. 在上传之前压缩文件,然后在服务器上解压缩并测试mime类型
  2. 通过可扩展的第三方解决方案上传S3桶
  3. 重命名上传的文件,但在标题或网址参数中发送文件名并测试mime类型