使用Java在Amazon S3上压缩整个目录

huangapple go评论65阅读模式
英文:

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来实现这一点。高层次的步骤如下:

  1. 通过调用 s3.listObjects() 获取S3存储桶中的所有对象。

  2. 对于每个对象,通过调用 s3.getObjectAsBytes() 获取字节数组。

  3. 将每个文件名和字节数组放入一个MAP中。

Map<String, byte[]> mapReport = new HashMap<>();

  1. 您可以使用Java逻辑从MAP创建ZIP文件。

  2. 通过调用 s3.PutObject 将ZIP文件放入S3存储桶中。

要创建ZIP文件,可以使用如下的Java逻辑:

// 传递一个MAP并获取代表所有图像的ZIP的字节数组。
public byte[] listBytesToZip(Map&lt;String, byte[]&gt; mapReporte) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ZipOutputStream zos = new ZipOutputStream(baos);
    for (Map.Entry&lt;String, byte[]&gt; 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文件,结果是完美的。

使用Java在Amazon S3上压缩整个目录

英文:

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:

  1. Get all objects in an S3 bucket by calling s3.listObjects().

  2. For each object, get the byte[] by calling s3.getObjectAsBytes().

  3. Place each file name and each byte[] into a MAP.

Map<String, byte[]> mapReport = new HashMap<>();

  1. You can use Java logic to create a ZIP from the MAP.

  2. 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&lt;String, byte[]&gt; mapReporte) throws IOException {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ZipOutputStream zos = new ZipOutputStream(baos);
            for (Map.Entry&lt;String, byte[]&gt; 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:

使用Java在Amazon S3上压缩整个目录

huangapple
  • 本文由 发表于 2023年2月18日 22:54:23
  • 转载请务必保留本文链接:https://go.coder-hub.com/75494152.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定