![](/img/trans.png)
[英]Move S3 objects to another folder in same bucket but with same permissions using C#
[英]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.