使用.net SDK从Amazon S3存储桶下载文件夹
问题描述:
如何使用.net sdk下载s3存储桶中存在的整个文件夹.尝试以下代码,它将抛出无效密钥.我需要下载存储桶中存在的嵌套pesudo文件夹中存在的所有文件,并将文件下载限制删除为1000默认.
How to download entire folder present inside s3 bucket using .net sdk.Tried with below code, it throws invalid key.I need to download all files present inside nested pesudo folder present inside bucket and removing file download limitations to 1000 which is default.
public static void DownloadFile()
{
var client = new AmazonS3Client(keyId, keySecret, bucketRegion);
ListObjectsV2Request request = new ListObjectsV2Request
{
BucketName = bucketName + "/private/TargetFolder",
MaxKeys = 1000
};
try
{
ListObjectsV2Response bucketResponse = client.ListObjectsV2(request);
foreach (S3Object o in bucketResponse.S3Objects)
{
var getRequest = new GetObjectRequest
{
BucketName = bucketResponse.Name + "/private/TargetFolder",
Key = bucketResponse.Name +"/private/TargetFolder/"+ o.Key
};
var response = client.GetObject(getRequest);
response.WriteResponseStreamToFile(downloadLocation + "\\" + o.Key);
var responseCode = response.HttpStatusCode;
if (response.HttpStatusCode == System.Net.HttpStatusCode.OK)
{
Console.WriteLine($"Success downloaded : {o.Key}");
}
else if (response.HttpStatusCode == System.Net.HttpStatusCode.RequestTimeout)
{
Console.WriteLine("Request Timeout error.");
}
else if (response.HttpStatusCode == System.Net.HttpStatusCode.ServiceUnavailable)
{
Console.WriteLine("Service Unavailable.");
}
else if (response.HttpStatusCode == System.Net.HttpStatusCode.InternalServerError)
{
Console.WriteLine("Internal Server error.");
}
else
{
Console.WriteLine("Please check the provided AWS Credentials.");
}
}
}
catch (AmazonS3Exception amazonS3Exception)
{
if (amazonS3Exception.ErrorCode != null &&
(amazonS3Exception.ErrorCode.Equals("InvalidAccessKeyId") || amazonS3Exception.ErrorCode.Equals("InvalidSecurity")))
{
Console.WriteLine("Please check the provided AWS Credentials.");
}
else
{
Console.WriteLine(amazonS3Exception.Message);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
提前谢谢!
答
尝试一下,它对我有用
public static void DownloadFile()
{
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls | SecurityProtocolType.Tls;
var client = new AmazonS3Client(keyId, keySecret, bucketRegion);
ListObjectsRequest request = new ListObjectsRequest();
request.BucketName = "BUCKET_NAME";
request.Prefix = "private/TargetFolder";
request.Delimiter = "/";
request.MaxKeys = 1000;
ListObjectsResponse response = client.ListObjects(request);
var x = response.S3Objects;
foreach (var objt in x)
{
GetObjectRequest request1 = new GetObjectRequest();
request1.BucketName = "BUCKET_NAME";
request1.Key = objt.Key;
GetObjectResponse Response = client.GetObject(request1);
if(objt.Size > 0){
using (Stream responseStream = Response.ResponseStream)
{
Response.WriteResponseStreamToFile(downloadLocation + "\\" + objt.Key);
}
}
}
}