首页 > 解决方案 > 在 java 中测试 zip 文件的上传会引发 EOFException

问题描述

我制作了用于上传 zip 文件的控制器,当我通过 Postman 对其进行测试时,一切都按预期工作。

现在我正在尝试使用自定义测试框架为此控制器创建测试。

我用于提取 zip 的控制器方法的一部分:

 try (final ZipInputStream zis = new ZipInputStream(file.getInputStream())) {
            byte[] buffer = new byte[1024];
            ZipEntry entry;
// until here everything works, next line throws EOFException
            while ((entry = zis.getNextEntry()) != null) {
                String entryName = entry.getName();
                StringBuilder stringBuilder = new StringBuilder();

                int read;

                while ((read = zis.read(buffer, 0, buffer.length)) != -1) {
                    stringBuilder.append(new String(buffer,0, read ));
                }

            }
        } catch (IOException e) {
            throw new GeneralServerException(e);
        }

一切正常: ((entry = zis.getNextEntry()) != null):

Caused by: java.io.EOFException
    at java.util.zip.ZipInputStream.readFully(ZipInputStream.java:405) ~[?:1.8.0_181]
    at java.util.zip.ZipInputStream.readLOC(ZipInputStream.java:321) ~[?:1.8.0_181]
    at java.util.zip.ZipInputStream.getNextEntry(ZipInputStream.java:122) ~[?:1.8.0_181]
    ... 81 more

这是我创建多部分请求的课程的一部分:

    private static final String FILE_PART_PATTERN = "\r\nContent-Disposition: form-data; name=\"file\"; filename=\"%s\";\r\nContent-Type: application/zip\r\n\r\n%s\r\n--";


        @Override
        public String getValue() {
            try {
                String fileContent = IOUtils.toString(getInputStream());
                String rawPart = String.format(FILE_PART_PATTERN, getName(), fileContent);
                return rawPart;
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }

这就是我在测试中创建多部分请求的文件部分的方式:

FilePart file = new FilePart("file", getClass().getResourceAsStream("/user_agreements.zip"));

我不明白问题出在哪里以及为什么这不起作用。通过 Postman 测试时,提取拉链的方法效果很好。

标签: javazipmultipartzipfile

解决方案


我只能建议检查一些我在使用文件系统时遇到的常见陷阱,因为我现在在你的实现中没有看到明显的错误:

  • 检查是否没有发生文件删除,尤其是在获取流和getNextEntry.
  • 检查您是否具有相应的访问/权限。
  • 检查文件是否被其他东西使用,例如在某处打开或以其他方式访问(!)
  • 获取 zip 本身并查看它是否正确打开,可能是在数据传输过程中损坏了

这些是我个人在某些时候遇到的问题。


推荐阅读