在Java中识别文件类型

请帮我查一下上传文件的类型。 我想区分excel类型和csv。

MIMEType为这两个文件返回相同的内容。 请帮忙。

我使用Apache Tika ,它使用魔术字节模式和globbing提示(文件扩展名)来识别文件类型,以检测MIME类型。 它还支持额外的文件内容解析(我没有真正使用)。

以下是一个快速而肮脏的示例,说明如何在不对文件执行任何其他解析的情况下使用Tika检测文件类型:

import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.HashMap; import org.apache.tika.metadata.HttpHeaders; import org.apache.tika.metadata.Metadata; import org.apache.tika.metadata.TikaMetadataKeys; import org.apache.tika.mime.MediaType; import org.apache.tika.parser.AutoDetectParser; import org.apache.tika.parser.ParseContext; import org.apache.tika.parser.Parser; import org.xml.sax.helpers.DefaultHandler; public class Detector { public static void main(String[] args) throws Exception { File file = new File("/pats/to/file.xls"); AutoDetectParser parser = new AutoDetectParser(); parser.setParsers(new HashMap()); Metadata metadata = new Metadata(); metadata.add(TikaMetadataKeys.RESOURCE_NAME_KEY, file.getName()); InputStream stream = new FileInputStream(file); parser.parse(stream, new DefaultHandler(), metadata, new ParseContext()); stream.close(); String mimeType = metadata.get(HttpHeaders.CONTENT_TYPE); System.out.println(mimeType); } } 

我希望这将有所帮助。 摘自一个不是我的例子:

 import javax.activation.MimetypesFileTypeMap; import java.io.File; class GetMimeType { public static void main(String args[]) { File f = new File("test.gif"); System.out.println("Mime Type of " + f.getName() + " is " + new MimetypesFileTypeMap().getContentType(f)); // expected output : // "Mime Type of test.gif is image/gif" } 

}

对于excel和csv类型也是如此。 未经测试。

我想通过java.nio.file.Files找到一种更便宜的方法

 public String getContentType(File file) throws IOException { return Files.probeContentType(file.toPath()); } 

– 要么 –

 public String getContentType(Path filePath) throws IOException { return Files.probeContentType(filePath); } 

希望有所帮助。

干杯。

不使用javax.activation.* 更好方法 javax.activation.*

  URLConnection.guessContentTypeFromName(f.getAbsolutePath())); 

如果你已经在使用Spring,这适用于csv和excel:

import org.springframework.mail.javamail.ConfigurableMimeFileTypeMap; import javax.activation.FileTypeMap; import java.io.IOException; public class ContentTypeResolver { private FileTypeMap fileTypeMap; public ContentTypeResolver() { fileTypeMap = new ConfigurableMimeFileTypeMap(); } public String getContentType(String fileName) throws IOException { if (fileName == null) { return null; } return fileTypeMap.getContentType(fileName.toLowerCase()); } }
import org.springframework.mail.javamail.ConfigurableMimeFileTypeMap; import javax.activation.FileTypeMap; import java.io.IOException; public class ContentTypeResolver { private FileTypeMap fileTypeMap; public ContentTypeResolver() { fileTypeMap = new ConfigurableMimeFileTypeMap(); } public String getContentType(String fileName) throws IOException { if (fileName == null) { return null; } return fileTypeMap.getContentType(fileName.toLowerCase()); } } 

或者使用javax.activation,您可以更新mime.types文件。

CSV将以文本开头,而excel类型很可能是二进制的。

然而,最简单的方法是尝试使用POI加载excel文档。 如果失败,请尝试将文件作为CSV加载,如果失败则可能不是类型。