![](/img/trans.png)
[英]Amazon S3 SELECT returning garbage data from a .csv file in S3 Bucket (using .NET SDK)
[英]Download folder from Amazon S3 bucket using .net SDK
如何使用 .net sdk 下載 s3 存儲桶中的整個文件夾。嘗試使用以下代碼,它會拋出無效的密鑰。我需要下載存儲桶中嵌套的 pesudo 文件夾中的所有文件,並將文件下載限制刪除為默認值 1000。
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();
}
提前致謝!
如果您在S3Objects.Count中總是得到 0,請嘗試不使用Delimiter屬性:
public async Task DownloadDirectoryAsync()
{
var bucketRegion = RegionEndpoint.USEast2;
var credentials = new BasicAWSCredentials(accessKey, secretKey);
var client = new AmazonS3Client(credentials, bucketRegion);
var bucketName = "bucketName";
var request = new ListObjectsV2Request
{
BucketName = bucketName,
Prefix = "directorey/",
MaxKeys = 1000
};
var response = await client.ListObjectsV2Async(request);
var utility = new TransferUtility(s3Client);
var downloadPath = "c:\\your_folder";
foreach (var obj in response.S3Objects)
{
utility.Download($"{downloadPath}\\{obj.Key}", bucketName, obj.Key);
}
}
當然,您需要s3:ListBucket權限
試試這個,它對我有用
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);
}
}
}
}
標記為已接受的解決方案使用 client.ListObjects(request) ,它在描述中說最多只需要 1000 個文件,如果文件夾中有更多文件,則下面的代碼可能會起作用。 謝謝。
public void DownloadallBucketFiles(string bucketName, string folderPath =
null)
{
var bucketRegion = RegionEndpoint.USEast1;
var credentials = new BasicAWSCredentials(S3CredentialsKey,
S3CredentialsSecret);
var s3Client = new AmazonS3Client(credentials, bucketRegion);
var utility = new TransferUtility(s3Client);
var dir = new S3DirectoryInfo(s3Client, bucketName);
var filesInBucket = dir.EnumerateFiles()?.ToList();
var path = (string.IsNullOrEmpty(folderPath)) ? S3LocalTempDir :
folderPath;
if (filesInBucket == null)
return;
filesInBucket.ForEach(file =>
{
try
{
if (!File.Exists(Path.Combine(path, file.Name)))
utility.Download($"{path}\\{file.Name}", bucketName,
file.Name);
Console.WriteLine(file.Name + " Processed");
}
catch(Exception ex)
{
Console.WriteLine(file.Name + $" download failed with error:
{ex.Message}");
}
});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.