Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确定Java中Zip存档文件的内容类型_Java_Archive_Unzip - Fatal编程技术网

确定Java中Zip存档文件的内容类型

确定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类型,

使用的环境是谷歌应用程序引擎。zip文件已上载到BlobStore中

我有以下代码:

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。