Как загрузить список файлов из AWS S3 с C # / .Net на мое устройство?

Я хочу загрузить несколько изображений, хранящихся в S3. Но пока было бы достаточно, если бы я мог скачать только одну. У меня есть информация о путях объектов. Код в документации AWS для .Net не включает соединение с ключом. Я объединил его с кодом из другого решения в Интернете, но результат не работает. Похоже, что в основном мне нужно создать AmazonS3Client на основе моих ключей и конфигурации доступа для подключения к серверу, а затем создать путь к хранилищу моего объекта на основе запроса, а затем каким-то образом прочитать данные и сохранить их на моем устройстве. Между прочим, в нашем AWS S3 у нас есть « роли », что означает, что моему пользователю в AWS недостаточно для доступа к этому объекту, я также должен изменить роль на ту, которая имеет доступ к этим изображениям после входа в систему.
Буду благодарен, если вы напишете в посте свои ответы, а не комментарии. Я дам тебе голос.

      using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.IO;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.IO.Compression;
 
namespace DownloadFromS3
{
    class GetObjectTest
    {
 
       private const string bucketName = "My_bucket";
       private const string keyName = "12/15345/3543.jpg";
     
       // private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;        
       private static IAmazonS3 client;

       static string regionName = "USWest2";   
       static string accessKey = "My_Access_Key";    
       static string secretKey = "My_secretKey";     
       static string extractToFolder = "C:\\Users\\me\\test";

       public static void Main()
       { 
        AmazonS3Config config = new AmazonS3Config();
        config.RegionEndpoint = RegionEndpoint.GetBySystemName(regionName);
        AmazonS3Client s3Client = new AmazonS3Client(accessKey, secretKey, config);

        ReadObjectDataAsync().Wait();  
       }

       static async Task ReadObjectDataAsync()
       {
            string responseBody = "";
            GetObjectRequest request = new GetObjectRequest
            {
                 BucketName = bucketName,
                 Key = keyName
            };

            using (GetObjectResponse response = await client.GetObjectAsync(request))
            using (Stream responseStream = response.ResponseStream)
            using (StreamReader reader = new StreamReader(responseStream))
            {
             string title = response.Metadata["amazon-title"]; 
             string contentType = response.Headers["jpg"];               
             Console.WriteLine("Object metadata, Title: {0}", title);
             Console.WriteLine("Content type: {0}", contentType);

             responseBody = reader.ReadToEnd();

             string tmpfilename = System.IO.Path.GetTempFileName();            

             File.ExtractToDirectory(tmpfilename, extractToFolder);
             }

       }

    }   
}

Документация AWS для загрузки объекта:https://docs.aws.amazon.com/AmazonS3/latest/userguide/download-objects.html

1 ответ

Я немного изменил ваш код и смог успешно выполнить запрос GetObjectAsync.

      using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.IO;
using System.Threading.Tasks;

namespace DownloadFromS3
{    
    class GetObjectTest
    {
        private static IAmazonS3 client;

        private const string regionName = "us-west-2";
        private const string accessKey = "accessKey";
        private const string secretKey = "secretKey";
        private const string bucketName = "bucketName";
        private const string keyName = "folder/keyName.jpg";

        public static void Main(string[] args)
        {
            client = new AmazonS3Client(accessKey, secretKey, RegionEndpoint.GetBySystemName(regionName));
            ReadObjectDataAsync().Wait();
        }

        static async Task ReadObjectDataAsync()
        {
            var request = new GetObjectRequest()
            {
                BucketName = bucketName,
                Key = keyName
            };

            using (var response = await client.GetObjectAsync(request))
            {
                using (var reader = new StreamReader(response.ResponseStream))
                {
                    var title = response.Metadata["amazon-title"];
                    var contentType = response.Headers["jpg"];
                    Console.WriteLine("Object metadata, Title: {0}", title);
                    Console.WriteLine("Content type: {0}", contentType);
                    var responseData = reader.ReadToEnd();
                }
            }
        }
    }
}

Код более-менее такой же. Я подозреваю

  • в regionNameиспользуемое значение Код региона AWS
  • Используемые учетные данные AWS не имеют достаточных разрешений для чтения данных из S3
Другие вопросы по тегам