使用 .net SDK 从 Amazon S3 存储桶下载文件夹

Asi*_*bal 6 c# amazon-s3 amazon-web-services

如何使用 .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();
    }
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Van*_*dze 6

如果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);
    }
} 
Run Code Online (Sandbox Code Playgroud)

当然,你需要s3:ListBucket权限