当前位置: 首页 > 面试题库 >

如何从文件中准确确定MIME数据?

戚永福
2023-03-14
问题内容

我正在向程序中添加一些功能,以便可以通过读取MIME数据来准确确定文件类型。我已经尝试了几种方法:

方法1:

javax.activation.FileDataSource

FileDataSource ds = new FileDataSource("~\\Downloads\\777135_new.xls");  
String contentType = ds.getContentType();  
System.out.println("The MIME type of the file is: " + contentType);

//output = The MIME type of the file is: application/octet-stream

方法2:

import net.sf.jmimemagic.*;

try
{
    RandomAccessFile f = new RandomAccessFile("~\\Downloads\\777135_new.xls", "r");
    byte[] fileBytes = new byte[(int)f.length()];
    f.read(fileBytes);
    MagicMatch match = Magic.getMagicMatch(fileBytes);
    System.out.println("The Mime type is: " + match.getMimeType());
}
catch(Exception e)
{
    System.out.println(e);
}

//output = The Mime type is: application/msword

方法3:

import eu.medsea.mimeutil.*;

MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
File f = new File ("~\\Downloads\\777135_new.xls");
Collection<?> mimeTypes = MimeUtil.getMimeTypes(f);
String mimeType = MimeUtil.getFirstMimeType(mimeTypes.toString()).toString();
String subMimeType = MimeUtil.getSubType(mimeTypes.toString());
System.out.println("The Mime type is: " + mimeTypes + ", " + mimeType + ", " + subMimeType);

//output = The Mime type is: application/msword, application/msword, msword

我在http://www.rgagnon.com/javadetails/java-0487.html上找到了这三种方法。但是我的问题是,我正在测试这些方法的文件是我创建的文件,所以我知道它是一个Excel文件,但是除第一个方法(我认为这是由于该方法使用的内置FileTypeMap中的文件类型数量有限。

我环顾四周,有人说这是因为在文件中检测到偏移量的方式,因此内容类型被错误地拾取,如本Wiki中有关检测PHP中的文件类型所指出的那样。不幸的是,然后Wiki继续使用扩展名来确定文件类型,因为它不可靠,所以这不是我想要的。

任何人都可以向我指出正确的方法,该方法可以在Java中正确检测文件类型吗?

干杯,阿列克谢·蓝。

编辑:似乎没有特定的解决方案,如@IronMensan在下面的评论中所述。我确实发现了这份非常有趣的研究论文,该论文以几种方式应用了机器学习来解决问题,但似乎没有一个完整的证明答案。我认为我最好的选择是尝试将文件传递给excel文件阅读器,并捕获任何不正确的格式异常。


问题答案:

正如评论中提到的那样,由于可能的文件类型太多,所有可能的文件都会被击中或丢失,但是您可能知道通常要处理的文件类型。这张出色的魔术数字列表最近帮助我对您提到的特定Office格式(搜索Microsoft
Office)进行了检测,您会发现MS
Office文件类型指定了子类型(该文件中还有其他子类型)并让您明确计算出您拥有哪种类型的文件。许多新格式(例如ODT,DOCX,OOXML等)都使用ZIP文件来保存其数据,因此您可能需要先检测zip,然后查找详细信息。



 类似资料:
  • 我正在将文件上传到Amazon s3 bucket,并且可以访问InputStream和一个包含文件的MIME类型但不是原始文件名的字符串。在将文件推到S3之前,由我来实际创建文件名和扩展名。是否有库或方便的方法从MIME类型中确定要使用的适当扩展? 我已经看到了一些关于Apache Tika库的引用,但这似乎有些过头了,我还没有能够让它成功地检测到文件扩展名。从我所能收集到的信息来看,这段代码应

  • 问题内容: 我正在将文件上传到Amazon s3存储桶,并可以访问InputStream和一个包含文件的MIME类型而不是原始文件名的字符串。在将文件推送到S3之前,实际由我决定要创建文件名和扩展名。是否有一种库或便捷的方法来确定要从MIME类型使用的适当扩展名? 我已经看到了对Apache Tika库的一些引用,但是这似乎有点过头了,而且我还无法获得它来成功检测文件扩展名。从我已经收集到的内容来

  • 问题内容: 假设给了我一个URI,并且我想找到返回的文件的文件扩展名,那么我必须在Java中做什么。 例如,位于http://www.daml.org/2001/08/baseball/baseball- ont 的文件为http://www.daml.org/2001/08/baseball/baseball- ont.owl 当我做 我无法看到带有扩展名的完整文件名,以及如何获取文件扩展名。`

  • 问题内容: 在Golang中,我正在寻找一种有效的方法来确定文件的行数。 当然,我总是可以遍历整个文件,但效率似乎并不高。 有没有一种更好的方法(更快,更便宜)来找出文件有多少行? 问题答案: 这是用于查找换行符的更快的行计数器。 它之所以更快,是因为它消除了返回整行所需的所有额外逻辑和缓冲,并利用了字节包提供的某些程序集优化功能来搜索字节片中的字符。 较大的缓冲区在这里也有帮助,尤其是对于较大的

  • 问题内容: 如何使用免费/开源Java API确定给定PDF文件中的页数? 问题答案: 您可以使用Apache PDFBox 加载PDF文档,然后调用该方法以返回页数。

  • 问题内容: 我在Java中使用PdfBox从PDF文件提取文本。提供的某些输入文件无效,这些文件上的PDFTextStripper暂停。有没有一种干净的方法来检查提供的文件是否确实是有效的PDF? 问题答案: 您可以找出文件(或字节数组)的mime类型,因此不必盲目地依赖扩展名。我是用光圈的MimeExtractor(http://aperture.sourceforge.net/)来完成的,或者