java - 在 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 测试时,提取拉链的方法效果很好。
解决方案
我只能建议检查一些我在使用文件系统时遇到的常见陷阱,因为我现在在你的实现中没有看到明显的错误:
- 检查是否没有发生文件删除,尤其是在获取流和
getNextEntry
. - 检查您是否具有相应的访问/权限。
- 检查文件是否被其他东西使用,例如在某处打开或以其他方式访问(!)
- 获取 zip 本身并查看它是否正确打开,可能是在数据传输过程中损坏了
这些是我个人在某些时候遇到的问题。
推荐阅读
- java - 如何验证地图请求正文中的格式日期?
- r - html_table 将列的值加倍
- c# - 如何找到外部 C# 方法的实现
- swift - Swift 4.1 - 无法将 [Character] 类型的值转换为 [String]
- common-lisp - 在 Common Lisp 中以宏列表作为参数的宏
- applescript - Applescript - 数字不会关闭“无标题”
- animation - 在 React Native 中,我们如何在渲染过程中为 FlatList 项目设置自定义显示动画?
- javascript - 我们可以将谷歌地图静态 URL 字符长度增加到最多五万个字符吗
- javascript - DSP.js 在大多数浏览器中失败
- python - NoReverseMatch at /post/new/ Reverse for 'post_publish' with keyword arguments '{'pk': ''}' not found