【问题标题】:How to find the original MIME type of a file while uploading it?上传文件时如何查找文件的原始 MIME 类型?
【发布时间】:2016-07-08 10:33:48
【问题描述】:

我必须在上传时找到文件的原始内容类型(MIME 类型)。

我只想允许 PDF 文件,但如果我将 .exe 文件重命名为 .pdf 文件,其类型显示为 pdf。

我想限制这类文件。

我正在使用以下代码:

if (!fileMultipart.getContentType().equalsIgnoreCase("application/pdf")) {
        msg = "Only pdf files are allowed.";
        System.out.println("Only pdf files are allowed.");
    }

还有一些在线工具可用于查找原始内容类型。我尝试使用 http://www.checkfiletype.com/ 并且它有效。

【问题讨论】:

  • 你不能做任何容易的事。问题不在于您,如果您从中下载文件的服务器将文件键入为 pdf,那么您将无法做任何更聪明的事情。您可以尝试验证文件本身是否有 PDF 标题,但我不确定是否值得努力,或者?

标签: java security spring-security mime-types multipart


【解决方案1】:

文件内容类型由上传时的用户代理/浏览器确定。如您所知,这可能是欺骗性的,也可能是不正确的。仅使用文件的内容类型确实无能为力。

另一种方法是在验证内容类型后进行更多检查,方法是尝试使用iTextPDFBox 或其他类似库打开 PDF 进行阅读。如果您无法打开该文件,那么您可以让用户知道它有问题。

【讨论】:

    【解决方案2】:
    public boolean isPDF(String fileName) {
    
      File file = new File(fileName);
      System.out.println("file upload isExist " + file.exists());
      boolean result = false;
      //Scanner input = null;
      try {
         Scanner input = new Scanner(new FileReader(file));
         System.out.println("fileScanner input " + input);
         while (input.hasNextLine()) {
            final String checkline = input.nextLine();
            if (checkline.contains("%PDF-")) {
               // a match!
               result = true;
               break;
            }
         }
      } catch (FileNotFoundException ex) {
         System.out.println("file upload is not valid " + file);
         Logger.getLogger(UploadContractorFile.class.getName()).log(Level.SEVERE, null, ex);
      }
      System.out.println("file upload final result " + result);
      return result;
     }
    

    【讨论】:

    • 我有 MultipartFile 的实例而不是文件,并且我没有文件路径,因为我在上传时正在检查它。我不想将文件保存在临时位置。
    猜你喜欢
    • 2011-02-02
    • 2011-06-09
    • 2021-08-09
    • 2014-02-20
    • 2011-02-13
    • 1970-01-01
    相关资源
    最近更新 更多