确定Java中Zip存档文件的内容类型
使用的环境是谷歌应用程序引擎。zip文件已上载到BlobStore中 我有以下代码:确定Java中Zip存档文件的内容类型,java,archive,unzip,Java,Archive,Unzip,使用的环境是谷歌应用程序引擎。zip文件已上载到BlobStore中 我有以下代码: ZipInputStream zis = ... ZipEntry ze = zis.getNextEntry(); while( ze != null){ System.out.println(ze.getName()); ze = zis.getNextEntry(); } 如何确定zip存档中每个文件的内容类型ze.getName方法显示文件名。文件类型如何 谢谢您可以使用mime类型,
ZipInputStream zis = ...
ZipEntry ze = zis.getNextEntry();
while( ze != null){
System.out.println(ze.getName());
ze = zis.getNextEntry();
}
如何确定zip存档中每个文件的内容类型ze.getName
方法显示文件名。文件类型如何
谢谢您可以使用
mime类型
,而不是试图通过文件扩展名猜测,在某些情况下可能会丢失文件扩展名。以下是建立文件的mime类型的选项:
使用javax.activation.MimetypesFileTypeMap
,如:
System.out.println("Mime Type of " + f.getName() + " is " +
new MimetypesFileTypeMap().getContentType(f));
MimetypesFileTypeMap mtft = new MimetypesFileTypeMap();
String mimeType = mtft.getContentType(ze.getName());
System.out.println(ze.getName()+" type: "+ mimeType);
使用java.net.URL
URL u = new URL(fileUrl);
URLConnection uc = u.openConnection();
type = uc.getContentType();
使用ApacheTika
ContentHandler contenthandler = new BodyContentHandler();
Metadata metadata = new Metadata();
metadata.set(Metadata.RESOURCE_NAME_KEY, f.getName());
Parser parser = new AutoDetectParser();
// OOXMLParser parser = new OOXMLParser();
parser.parse(is, contenthandler, metadata);
System.out.println("Mime: " + metadata.get(Metadata.CONTENT_TYPE));
System.out.println("Title: " + metadata.get(Metadata.TITLE));
System.out.println("Author: " + metadata.get(Metadata.AUTHOR));
System.out.println("content: " + contenthandler.toString());
JMimeMagic
MagicMatch match = parser.getMagicMatch(f);
System.out.println(match.getMimeType()) ;
mime util
Collection<?> mimeTypes = MimeUtil.getMimeTypes(f);
Aperture is an open source library and framework for crawling and indexing
information sources such as file systems, websites and mail boxes.
javax.activation.MimetypesFileTypeMap
,如:
System.out.println("Mime Type of " + f.getName() + " is " +
new MimetypesFileTypeMap().getContentType(f));
MimetypesFileTypeMap mtft = new MimetypesFileTypeMap();
String mimeType = mtft.getContentType(ze.getName());
System.out.println(ze.getName()+" type: "+ mimeType);
您可以使用标准的黑客方法从文件名(lastIndexOf(“.”)中提取扩展名。嗯,OP不需要额外的信息吗?例如,如果没有扩展名,或者有人弄乱了他们的文件,并将“txt”命名为“pdf”?我猜只要处理-1,当名称像“SillyFileExtension”时。只需像处理普通文件一样处理regex?@JRGalia:完全有可能伪造扩展名,甚至文件签名,除非工具非常彻底(不过我怀疑是否有)。问题是您希望内容类型检测的距离有多近:基于扩展名或文件签名(从我所看到的内容类型检测最多取决于文件签名)。我不确定哪一个可以与ZipEntry一起使用。@JRGalia查看我更新的答案。最简单的方法是使用第一种方法。它是zip appengine文件的ZipEntry。@Maarten谢谢,这已经是我在回答中建议的第一个选项:)。我认为这种方法不适用于
ZipEntry
(测试表明我是对的)。在mtft.getContentType(ze.getName())
中提供ze.getName()
可以使MimetypesFileTypeMap
在光盘上查找它想要读取的具有该名称的文件。但是,这样的文件并不存在,因为这个名称只是zip存档中的文件的原始名称。因此,对于每个文件,我将“application/octetstream”作为resut。