英文:
Zip entire directory on Amazon S3 using java
问题
如果我有一个包含小文件的S3目录,是否有一种使用JAVA轻松将整个目录压缩并将生成的ZIP文件留在S3上的方法?
英文:
If I have a directory with small files on S3, is there a way to easily zip up the entire directory and leave the resulting zip file on S3 Using JAVA?
答案1
得分: 1
Amazon S3不提供直接在S3存储桶中压缩对象的操作。但是,您可以使用AWS SDK for Java V2来实现这一点。高层次的步骤如下:
-
通过调用 s3.listObjects() 获取S3存储桶中的所有对象。
-
对于每个对象,通过调用 s3.getObjectAsBytes() 获取字节数组。
-
将每个文件名和字节数组放入一个MAP中。
Map<String, byte[]> mapReport = new HashMap<>();
-
您可以使用Java逻辑从MAP创建ZIP文件。
-
通过调用 s3.PutObject 将ZIP文件放入S3存储桶中。
要创建ZIP文件,可以使用如下的Java逻辑:
// 传递一个MAP并获取代表所有图像的ZIP的字节数组。
public byte[] listBytesToZip(Map<String, byte[]> mapReporte) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(baos);
for (Map.Entry<String, byte[]> reporte : mapReporte.entrySet()) {
ZipEntry entry = new ZipEntry(reporte.getKey());
entry.setSize(reporte.getValue().length);
zos.putNextEntry(entry);
zos.write(reporte.getValue());
}
zos.closeEntry();
zos.close();
return baos.toByteArray();
}
我从我的示例Web应用程序中测试了这些步骤。我的Web应用程序使用了此线程中指定的逻辑下载了ZIP文件,结果是完美的。
英文:
Amazon S3 does not have an operation that lets you ZIP up objects in an S3 bucket out of the box. However, you can do this with AWS SDK for Java V2. The high level steps are:
-
Get all objects in an S3 bucket by calling s3.listObjects().
-
For each object, get the byte[] by calling s3.getObjectAsBytes().
-
Place each file name and each byte[] into a MAP.
Map<String, byte[]> mapReport = new HashMap<>();
-
You can use Java logic to create a ZIP from the MAP.
-
Put the ZIP into an S3 bucket by calling s3.PutObject.
To create ZIP, use Java logic such as:
// Pass a map and get back a byte[] that represents a ZIP of all images.
public byte[] listBytesToZip(Map<String, byte[]> mapReporte) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(baos);
for (Map.Entry<String, byte[]> reporte : mapReporte.entrySet()) {
ZipEntry entry = new ZipEntry(reporte.getKey());
entry.setSize(reporte.getValue().length);
zos.putNextEntry(entry);
zos.write(reporte.getValue());
}
zos.closeEntry();
zos.close();
return baos.toByteArray();
}
I tested these steps from my sample web app. My web app downloaded the ZIP file using the logic specified in this thread. Results were perfect:
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论