【问题标题】:Spring: how to parse uploaded zip file?Spring:如何解析上传的 zip 文件?
【发布时间】:2012-06-16 11:40:14
【问题描述】:

我将我的 zip 存档上传到服务器,并希望在其中打开 .txt 和 .jpg 文件。我成功地在我的控制器中获取了我的存档,并通过ZipEntry 获取了每个文件的名称。现在我想打开它,但为此我应该得到我的文件的完整路径。

我还没有找到如何做到这一点。你能建议一些方法来做到这一点吗?

更新

我尝试使用下面建议的示例,但我无法打开文件

ZipFile zFile = new ZipFile("trainingDefaultApp.zip");

我有FileNotFoundException

所以我回到我的起点。我在 Java Spring 应用程序中有上传表单。在控制器中,我有一个 zip 存档为 byte[]

@RequestMapping(method = RequestMethod.POST)
public String create(UploadItem uploadItem, BindingResult bindingResult){
    try {
        byte[] zip = uploadItem.getFileData().getBytes();
        saveFile(zip);

然后我得到了每个ZipEntry

    InputStream is = new ByteArrayInputStream(zip);
    ZipInputStream zis = new ZipInputStream(is);

    ZipEntry entry = null;
    while ((entry = zis.getNextEntry()) != null) {
        String entryName = entry.getName();
        if (entryName.equals("readme.txt")) {
            ZipFile zip = new ZipFile(entry.getName()); // here I had got an exception

根据文档,我做得很好,但对我来说,只传递文件名并怀疑你会成功打开文件很奇怪

【问题讨论】:

  • 什么意思?你说你打开成功了;你没有“完整路径”到什么地方?
  • 我打开了 CommonsMultipartFile,其中包含我的 zip 存档为 byte[]。我将它转换为 ZipInputStream 并在循环中为我的存档中的每个文件都有一个 ZipEntry。现在我想阅读这个 .txt 文件和 .jpg 文件,但 ZipEntry 只包含这些文件的名称。所以我没有这个文件的完整路径,无法将它作为新文件打开(“d:/some.txt”)

标签: java spring zip zipinputstream


【解决方案1】:

我解决了我的 uissue。解决方案是直接使用 ZipInputStream。代码如下:

    private void saveFile(byte[] zip, String name, String description) throws IOException {
    InputStream is = new ByteArrayInputStream(zip);
    ZipInputStream zis = new ZipInputStream(is);

    Application app = new Application();
    ZipEntry entry = null;
    while ((entry = zis.getNextEntry()) != null) {
        String entryName = entry.getName();
        if (entryName.equals("readme.txt")) { 
           new Scanner(zis); //!!!
           //... 
           zis.closeEntry();

【讨论】:

    【解决方案2】:

    zipFile.getInputStream(ZipEntry entry) 将为您返回特定条目的输入流。

    查看javadocs 以获得ZipFile.getInputStream() - http://docs.oracle.com/javase/6/docs/api/java/util/zip/ZipFile.html#getInputStream(java.util.zip.ZipEntry)。

    更新:

    我误读了你的问题。对于使用 ZipInputStream,Oracle 网站 (http://java.sun.com/developer/technicalArticles/Programming/compression/) 上有示例代码,向您展示了如何从流中读取。请参阅第一个代码示例:代码

    • 示例 1:UnZip.java。

    在这里复制,它是从条目中读取并将其直接写入文件,但您可以将其替换为您需要的任何逻辑:

    ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
    ZipEntry entry;
    while((entry = zis.getNextEntry()) != null) {
       System.out.println("Extracting: " +entry);
       int count;
       byte data[] = new byte[BUFFER];
       // write the files to the disk
       FileOutputStream fos = new FileOutputStream(entry.getName());
       dest = new 
       BufferedOutputStream(fos, BUFFER);
    
       while ((count = zis.read(data, 0, BUFFER)) != -1) {
            dest.write(data, 0, count);
       }
    }
    

    【讨论】:

    • 我的错,刚刚看到你有一个 ZipInputStream,而不是一个 ZipFile。 Oracle 网站 (java.sun.com/developer/technicalArticles/Programming/…) 上的示例代码向您展示了如何从流中读取。请参阅第一个代码示例:代码示例 1:UnZip.java。
    • 嗯..如何使用 ZipFile?在consructor中,我应该传递如果没有该文件的完整路径就无法创建的文件。如果我将文件名作为字符串传递,我会得到 FileNotFoundException
    • 我试试这个例子。我有同样的例外。它说找不到该文件。为了测试,我硬编码了我的档案“tetx.zip”的名称,但是在尝试创建新的 FileInputStream(“tetx.zip”)时我失败了。是错还是其他地方的问题?
    • 如果可以,您可能希望发布您的代码。我不确定是什么问题。
    • 感谢您的帮助,保罗。我用代码和描述来扩展我的问题。可能有助于理解问题的原因。
    猜你喜欢
    • 1970-01-01
    • 2012-07-04
    • 2013-12-07
    • 2013-04-12
    • 1970-01-01
    • 2011-06-13
    • 2017-11-11
    • 1970-01-01
    • 2011-04-17
    相关资源
    最近更新 更多