【问题标题】:How to validate a file with valid extension?如何验证具有有效扩展名的文件?
【发布时间】:2014-02-02 08:35:05
【问题描述】:

假设我的 Java 代码的输入是一个 jpeg 文件。在开始输入具有有效扩展名的过程之前,我如何验证它。有时用户上传一个扩展名为 jpeg 的 pdf 文件,从而导致代码崩溃。

每个文件都有一个幻数。但是有没有办法解决这个问题。

【问题讨论】:

  • .toString().endsWith(SOMETHING)?
  • 但是如果用户给我一个“.jpeg”文件,它实际上是一个 pdf 文件,只是扩展名发生了变化。

标签: java file


【解决方案1】:

如果你只想检查文件名,你可以这样做:

public boolean checkJPEG(File file) {
   String fileName = file.getName().toUpperCase();
   return fileName.endsWith(".JPG") || fileName.endsWith(".JPEG");
}

但是这种方法只检查文件名,而不检查内容。更完整的方法包括幻数测试。

public boolean checkJPEG(File file) throws IOException {
   String fileName = file.getName().toUpperCase();
   boolean extension = fileName.endsWith(".JPG") || fileName.endsWith(".JPEG");
   if (!extension) {
      return false;
   }
   FileInputStream in = null;
   try {
      in = new FileInputStream(file)
      byte[] magic = new byte[3];
      int count = in.read(magic);
      if (count < 3) return false;
      return magic[0] == 0xFF && magic[1] == 0xD8 && magic[2] == 0xFF;
   } finally {
      try {
         if (in != null) in.close();
      } catch (IOException ex) {}
   }
}

此处的文件签名列表:http://en.wikipedia.org/wiki/List_of_file_signatures

【讨论】:

    【解决方案2】:

    幻数解决方案已经实现:请参阅this topic 以获取指向 Java Mime 魔术库的链接。

    【讨论】:

    • 非常感谢您的评论。对我帮助很大。
    【解决方案3】:

    您无法确定文件类型,除非您完全解析文件并验证它是否完全符合格式规范。只有这样你才能确定

    检查幻数是一种快速检查方法,很有可能正确猜出类型。但显然它不是万无一失的,它很容易制作一个以字节FF D8 FF开头的文件,看起来像jpeg,但显然不能保证它真的是jpeg。

    或者只是依赖文件扩展名。

    您只需要在可靠性和简单性之间进行权衡。如果您想要简单,请相信文件扩展名。如果您想要安全,请验证文件内容。

    【讨论】:

    • 好吧,至少他知道如果幻数不正确,它就不是JPEG。所以意外重命名可以很好的处理。这并不能防止恶意伪造的 JPEG,您所说的所有内容都适用。
    【解决方案4】:

    检查文件签名:

    http://www.filesignatures.net/index.php?search=JPEG&mode=EXT

    http://en.wikipedia.org/wiki/List_of_file_signatures

    您可以通过读取几个字节来验证文件类型。

    问候。

    【讨论】:

      【解决方案5】:

      一个。下面的这个函数将列出目录中的所有扩展。您可以做的是列出所有文件并获取所有文件的扩展名,并可以检查哪些文件可以上传。您可以在 UI 上提供客户端验证,仅允许使用 .jpeg 文件。

      public static void main(String args[]) {
              System.out.println("GET");
              File fileObj = new File("D:\\");
              File[] listAll = fileObj.listFiles();
              for (File file : listOfFiles) {
              if (file.isFile()) {
                  System.out.println("Extension ."+file.getName().substring(file.getName().lastIndexOf('.')+1));
              }
              }
          }
      

      b.关于延期的失误,我没有经历过这种情况。可能是eltabo指定的点可以提供帮助。

      【讨论】:

        【解决方案6】:

        我有一个案例,我需要验证 zip 文件中的图像文件是 .JPEG,而不是解压缩文件。

        此方法有效:

        public void ZipFileExtractAndVerifyImageFileExtension(String FileNamewithPath) {
            File file = new File(FileNamewithPath);
            InputStream input;
            try {
        
              input = new FileInputStream(file);
              ZipInputStream zip = new ZipInputStream(input);
              ZipEntry entry;
        
              while(zip.getNextEntry()!=null) {
                  entry = zip.getNextEntry();
                  if(entry!= null) {
                     if(entry.getName().endsWith(".JPG") || entry.getName().endsWith(".JPEG")||entry.getName().endsWith(".jpeg")) {
                        System.out.println("Current File Name=" + entry.getName() + " Current File Size is " + entry.getSize());
                     }     
                  }
               }
               zip.close();
               input.close();
             
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }   
        }
        

        【讨论】:

        • 这应该可以在.zip 文件中查看文件名extensions,但作为最初的问题,该人想要验证文件的内容实际上是有效 JPEG 文件。您还可以将条目名称小写以简化扩展检查(这将正确处理.jpg 扩展)。
        猜你喜欢
        • 2012-08-24
        • 2015-08-01
        • 2018-11-26
        • 1970-01-01
        • 2016-10-26
        • 2016-09-11
        • 1970-01-01
        • 2011-04-07
        • 2014-11-06
        相关资源
        最近更新 更多