簡體   English   中英

使用 .net SDK 從 Amazon S3 存儲桶下載文件夾

[英]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.

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