Java Spring:如何解析上传的zip文件?

Java Spring:如何解析上传的zip文件?,java,spring,zip,zipinputstream,Java,Spring,Zip,Zipinputstream,我将我的zip存档上传到服务器,并希望在其中打开.txt和.jpg文件。我成功地在控制器中获取了存档文件,并通过ZipEntry获取了每个文件的名称。现在我想打开它,但为此,我应该得到我的文件的完整路径 我还没找到我该怎么做。你能建议一些方法吗 更新 我尝试使用下面建议的示例,但我无法打开该文件 ZipFile zFile = new ZipFile("trainingDefaultApp.zip"); 我得到了FileNotFoundException 所以我回到我的出发点。我在JavaSp

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

我还没找到我该怎么做。你能建议一些方法吗

更新

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

ZipFile zFile = new ZipFile("trainingDefaultApp.zip");
我得到了
FileNotFoundException

所以我回到我的出发点。我在JavaSpring应用程序中上传了表单。在控制器中,我得到了一个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

根据文档,我做得很好,但对于我来说,仅传递文件名并怀疑您将成功打开文件是很奇怪的。getInputStream(ZipEntry条目)将返回特定条目的inputstream

ZipFile zFile = new ZipFile("trainingDefaultApp.zip");
检查
ZipFile.getInputStream()
-

更新:

我误解了你的问题。对于使用
ZipInputStream
,Oracle网站()上有一个示例代码,向您展示了如何从流中读取数据。请参见第一个代码示例:代码

  • 示例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。代码如下:

    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();

什么意思?你说你成功地打开了它;您没有“完整路径”指向什么?我打开了CommonsMultipartFile,其中包含作为字节[]的zip存档文件。我将其转换为ZipInputStream,在循环中,我的存档中的每个文件都有一个ZipEntry。现在我想读取这个.txt文件和.jpg文件,但ZipEntry只包含这些文件的名称。因此,我没有这个文件的完整路径,也无法将其作为新文件(“d:/some.txt”)打开。我的坏消息是,刚刚看到您有一个ZipInputStream,而不是ZipFile。Oracle网站()上有一个示例代码,向您展示了如何从流中读取数据。请参阅第一个代码示例:代码示例1:UnZip.java.Mmm..如何使用ZipFile?在constructor中,我应该传递一个文件,如果没有该文件的完整路径,我将无法创建该文件。如果我将文件名作为字符串传递,则得到filenotfoundexception,请尝试此示例。我也有同样的理由。上面说找不到那个文件。对于测试,我硬编码了我的归档文件名“tetx.zip”,但在尝试创建新的FileInputStream(“tetx.zip”)时失败了。这是错误的还是其他地方的问题?如果你可以,你可能想发布你的代码。我不知道是什么问题。谢谢你的帮助,保罗。我用代码和描述来表达我的问题。也许这有助于理解问题的原因。