java - 压缩多部分文件并通过 FTP 存储
问题描述
我SAMPLE.csv
在输入中采用了多部分文件(即)。我应该压缩它(即SAMPLE.zip
)并通过 FTP 存储它。
public void zipAndStore(MultipartFile file) {
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(baos);
InputStream is = file.getInputStream()) {
ZipEntry zipEntry = new ZipEntry("SAMPLE.zip");
zos.putNextEntry(zipEntry);
byte[] bytes = new byte[1024];
int length;
while ((length = is.read(bytes)) >= 0) {
zos.write(bytes, 0, length);
}
zos.closeEntry();
storeFtp("SAMPLE.zip", new ByteArrayInputStream(baos.toByteArray()));
} catch (Exception e) {
}
}
使用storeFtp
方法org.apache.commons.net.ftp.FTPClient.storeFile(String remote, InputStream local)
。
问题是上传的文件已损坏,我无法手动解压缩。怎么了?
解决方案
一个 zipfile在文件末尾有一个列表DirEntries
和一个(在所有 ZipFileRecords 之后,即代码中的 ZipEntries)。endLocator
因此,您可能必须在调用之前关闭 zipfilestoreFtp()
以确保将DirEntries
和endLocator
写入文件:
zos.closeEntry();
zos.close();
storeFtp("SAMPLE.zip", new ByteArrayInputStream(baos.toByteArray()));
(我不太了解Java,所以无法检查或测试完整代码)
另请查看此答案。
推荐阅读
- docker - 容器中进程的虚拟内存含义
- c# - 输入字符串的格式不正确 - 插入数据库
- ruby-on-rails - 使用 Rubocop 重构 Rails 应用程序的最佳方法
- c# - OnCollisionEnter 函数如何“从根本上”工作?
- reactjs - setState 没有更新反应组件中的值
- angular - Rest API 上的多个 HTTP 请求
- google-analytics - 着陆页、目标页或目标 URL?
- javascript - 代码没有按顺序运行?对 DOM 的更新是同时发生的?
- php - XPath 表达式获取
标签后的字符串 - css - 创建一个带有间距和固定宽度的 flexbox 网格