簡體   English   中英

如何使用 C# 在單個 zip 文件中壓縮多個 S3 對象並將其移動到同一存儲桶中的另一個文件夾

[英]How to zip multiple S3 Objects in a single zip file and move it to another folder in the same bucket using C#

我正在嘗試編寫一個 lambda 函數,它將下載文件夾中存在的所有 s3 對象壓縮到一個 zip 文件中,然后將該 zip 文件移動到同一個 s3 存儲桶中的 BatchDownload 文件夾。

 ListObjectsRequest downloadS3Object = new ListObjectsRequest
                    {
                        BucketName = sample,
                        Prefix = download
                    };
                    ListObjectsResponse downloadResponse = s3Client.ListObjectsAsync(downloadS3Object).Result;
                    List<string> downloadS3ObjectKeys = downloadResponse.S3Objects.Where(x => !string.IsNullOrEmpty(Path.GetFileName(x.Key)))
                                                                                .Select(s3Object => s3Object.Key)
                                                                                .ToList();

                    foreach (string downloadS3ObjectKey in downloadS3ObjectKeys)
                    {
                        ListObjectsRequest checkBatchDownload = new ListObjectsRequest
                        {
                            BucketName = sample,
                            Prefix = batchDownload
                        };
                        ListObjectsResponse s3ObjectResponse = s3Client.ListObjectsAsync(checkBatchDownload).Result;
                        bool IsArchived = false;
                        if (s3ObjectResponse.S3Objects.Count <= 0)
                        {
                            PutObjectRequest createBatchFolder = new PutObjectRequest()
                            {
                                BucketName = sample,
                                Key = batchDownload
                            };
                            s3Client.PutObjectAsync(createBatchFolder);
                        }

在上面的代碼中,我從下載文件夾中獲取所有對象,然后遍歷每個對象鍵。 我不明白如何將所有對象鍵壓縮到一個 zip 文件中。 有沒有更好的方法可以在不單獨獲取對象鍵的情況下做到這一點。 您能否提供代碼以將下載文件夾的所有對象壓縮到一個 zip 文件中並將該文件移動到一個新文件夾中。

我不確定您為什么似乎再次調用ListObjects ,以及再次重新上傳相同的對象,但這似乎不對。

您似乎想下載所有對象,將它們放在一個 zip 存檔中,然后重新上傳。

因此,您需要以下內容:

var downloadS3Object = new ListObjectsRequest
{
    BucketName = sample,
    Prefix = download
};
List<string> downloadS3ObjectKeys;
using (var downloadResponse = await s3Client.ListObjectsAsync(downloadS3Object))
{
    downloadS3ObjectKeys = downloadResponse.S3Objects
        .Where(x => !string.IsNullOrEmpty(Path.GetFileName(x.Key)))
        .Select(s3Object => s3Object.Key)
        .ToList();
}

var stream = new MemoryStream();
using (var zip = new ZipArchive(stream, ZipArchiveMode.Update, true))
{
    foreach (string downloadS3ObjectKey in downloadS3ObjectKeys)
    {
        var getObject = new GetObjectRequest
        {
            BucketName = sample,
            Key = downloadS3ObjectKey,
        };
        var entry = zip.CreateEntry(downloadS3ObjectKey);

        using (var zipStream = entry.Open())
        using (var objectResponse = await s3Client.GetObjectAsync(getObject))
        using (var objectStream = objectResponse.ResponseStream)
        {
            await objectStream.CopyToAsync(zip);
        }
    }
}

stream.Position = 0;  // reset the memorystream to the beginning
var createBatchFolder = new PutObjectRequest()
{
    BucketName = sample,
    Key = batchDownload,
    InputStream = stream,
};

using (await s3Client.PutObjectAsync(createBatchFolder))
{  //
}

注意使用using來處理東西,也不要使用.Result ,因為你可能會死鎖,而是使用await

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM