Как загрузить файл с моего локального компьютера в хранилище s3 glacier с помощью c # в консольном приложении? - PullRequest
1 голос
/ 24 апреля 2019

кто-то знает, как это сделать, потому что я проводил расследование, но я нашел только неправильные / не работающие ответы. Я пробовал множество решений, но, похоже, это неправильно, например, использование каталога Chilkat, использование ArchiveTransferManager...

        Chilkat.Rest rest = new Chilkat.Rest();  
        bool bTls = true;
        int port = 443;
        bool bAutoReconnect = true;
        bool success = rest.Connect("glacier.eu-west-1.amazonaws.com", port, bTls, bAutoReconnect);
        Chilkat.AuthAws authAws = new Chilkat.AuthAws();
        authAws.AccessKey = ;
        authAws.SecretKey = ;
        authAws.ServiceName = "glacier";
        authAws.Region = "us-west-1";        
        success = rest.SetAuthAws(authAws);      
        rest.AddHeader("x-amz-glacier-version", "2012-06-01");            
        string filePath = "20190422.csv";
        Chilkat.Crypt2 crypt = new Chilkat.Crypt2();
        crypt.HashAlgorithm = "sha256-tree-hash";
        crypt.EncodingMode = "hexlower";
        string treeHashHex = crypt.HashFileENC(filePath);
        rest.AddHeader("x-amz-sha256-tree-hash", treeHashHex);
        crypt.HashAlgorithm = "sha256";
        string linearHashHex = crypt.HashFileENC(filePath);
        authAws.PrecomputedSha256 = linearHashHex;           
        rest.AddHeader("x-amz-archive-description", filePath);
        Chilkat.Stream fileStream = new Chilkat.Stream();
        fileStream.SourceFile = filePath;
        string responseStr = rest.FullRequestStream("POST", "/682988997959/vaults/streamqueuesvault", fileStream);
        if (rest.LastMethodSuccess != true)
        {
            Debug.WriteLine(rest.LastErrorText);
            return;
        }

        int respStatusCode = rest.ResponseStatusCode;
        if (respStatusCode >= 400)
        {
            Debug.WriteLine("Response Status Code = " + Convert.ToString(respStatusCode));
            Debug.WriteLine("Response Header:");
            Debug.WriteLine(rest.ResponseHeader);
            Debug.WriteLine("Response Body:");
            Debug.WriteLine(responseStr);
            return;
        }

        Debug.WriteLine("response status code = " + Convert.ToString(respStatusCode));


        string archiveId = rest.ResponseHdrByName("x-amz-archive-id");
        Debug.WriteLine("x-amz-archive-id = " + archiveId);

        string location = rest.ResponseHdrByName("Location");
        Debug.WriteLine("Location = " + location);

Ответы [ 3 ]

0 голосов
/ 25 апреля 2019

Убедитесь, что ваш регион соответствует.В следующем коде «eu-west-1» используется в вызове Connect, но «us-west-1» используется для authAws.Region.

    bool success = rest.Connect("glacier.eu-west-1.amazonaws.com", port, bTls, bAutoReconnect);
    Chilkat.AuthAws authAws = new Chilkat.AuthAws();
    authAws.AccessKey = ;
    authAws.SecretKey = ;
    authAws.ServiceName = "glacier";
    authAws.Region = "us-west-1";        
0 голосов
/ 27 апреля 2019

Вот пошаговое руководство по Как загрузить файл с моего локального компьютера в хранилище ледника s3 с помощью c # в консольном приложении? . Сначала я хотел бы представить некоторую базовую справочную информацию, которая будет использоваться позже в решении. Не стесняйтесь переходить к решению, если вы умны в S3 Glacier.

Если у вас уже установлен AWS SDK для .NET и VS, вы можете загрузить Repo с Github .

Краткое введение в S3-Glacier

Amazon S3 Glacier - это недорогая услуга длительного хранения Amazons.

В терминологии Glacier объект называется Archive . Также папки, в которых вы храните архивы, называются Хранилища . Это довольно просто - из Glacier FAQ :

В: Как организованы данные в Amazon S3 Glacier? Вы храните данные в Amazon S3 Glacier в виде архива. Каждому архиву присваивается уникальный идентификатор архива, который впоследствии можно использовать для извлечения данных. Архив может представлять собой один файл, или вы можете объединить несколько файлов для загрузки в один архив. Вы загружаете архивы в хранилища. Хранилища - это коллекции архивов, которые вы используете для организации ваших данных.

Когда вы загружаете объекты в S3 Glacier, объекты не сразу появляются в вашей консоли Glacier. Ваша консоль Glacier будет обновляться один раз в день.

Amazon рекомендует использовать AWS SDK для .NET при разработке приложений на C #, которые взаимодействуют со службами AWS.

Простое решение

Прежде чем приступить к кодированию, перейдите в консоль AWS и создайте имя хранилища S3 Glacier Vault «TestVault».

На момент выпуска данного решения (апрель 2019 г.) я предлагаю вам использовать Visual Studio 2019. Эти шаги аналогичны для более ранних версий Visual Studio.

Код, который я представляю, был взят непосредственно из AWS SDK для документации .NET .

Когда ваша визуальная студия будет готова, выполните следующие действия:

  1. Создайте новый проект (используйте шаблон -> Консольное приложение (.NET Framework) - не Консольное приложение (.NET Core) и назовите его ConsoleApp9
  2. Добавьте AWS SDK в свой проект с помощью команды диспетчера пакетов NuGet . В меню Сервис выберите пункт Диспетчер пакетов Nuget и нажмите Консоль диспетчера пакетов. затем введите Install-Package AWSSDK.

    Для MAC используйте Project-> Add Nuget Packages. Найдите «AWSSDK.Glacier» и установите его.

  3. Ниже приведен рабочий код. Вам нужно скопировать большую часть этого в ваш Program.cs и удалить код "Hello World" по умолчанию. Ваш окончательный код Program.cs должен выглядеть как

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    using Amazon.Glacier;
    using Amazon.Glacier.Transfer;
    using Amazon.Runtime;
    
    namespace ConsoleApp9
    {
    class Program
    {
    
        static string vaultName = "TestVault";
        static string archiveToUpload = "C:\\Windows\\Temp\\TEST-ARCHIVE.txt";
    
        static void Main(string[] args)
        {
    
            try
            { 
                var manager = new ArchiveTransferManager(Amazon.RegionEndpoint.USEast1);
                // Upload an archive.
                string archiveId = manager.Upload(vaultName, "upload archive test", archiveToUpload).ArchiveId;
                Console.WriteLine("Archive ID: (Copy and save this ID for use in other examples.) : {0}", archiveId);
                Console.WriteLine("To continue, press Enter");
                Console.ReadKey();
            }
            catch (AmazonGlacierException e) { Console.WriteLine(e.Message); }
            catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
            catch (Exception e) { Console.WriteLine(e.Message); }
            Console.WriteLine("To continue, press Enter");
            Console.ReadKey();
    
        }
    }
    }
    
  4. Поместите файл, который вы хотите загрузить в Glacier, как c:\Windows\Temp\Test-Archive.txt. Вы можете поместить файл куда угодно, просто обновите переменную archiveToUpload в своем коде, чтобы отразить местоположение.

  5. Если ваш регион не USEast1, измените регион AWS на строке сразу после try:

var manager = new ArchiveTransferManager(Amazon.RegionEndpoint.YOUR-REGION);

  1. Запустите программу, и она загрузит файл. Если вы установили AWS SDK до этого, скорее всего, он будет работать нормально, и у вас будет экран, на котором будет показан идентификатор вашего архива enter image description here
  2. Если вы столкнулись с ошибками прав доступа или авторизации - выполните следующие действия для настройки авторизации для AWS SDK . Я рекомендую использовать файл учетных данных (2-й вариант сверху). Другие проблемы могут быть неправильными Vault Name или он не может найти файл на вашем компьютере.
  3. Когда вы вернетесь к консоли Glacier, вы не увидите загруженных файлов. Glacier отличается низкой стоимостью и медленным перемещением по сравнению с s3, поэтому содержимое Vault обновляется один раз в день.

enter image description here

Пока вы получаете идентификатор на шаге 6, ваш файл был успешно сохранен в Glacier.

Надеюсь, это поможет, и вы найдете успех.

0 голосов
/ 24 апреля 2019

Может быть, это поможет

AmazonS3Client S3Client = new AmazonS3Client (credentials,region);

// Create a client
AmazonS3Client client = new AmazonS3Client();

// Create a PutObject request
PutObjectRequest request = new PutObjectRequest
{
    BucketName = "SampleBucket",
    Key = "Item1",
    FilePath = "contents.txt"
};

// Put object
PutObjectResponse response = client.PutObject(request);

Источник = https://docs.aws.amazon.com/mobile/sdkforxamarin/developerguide/s3-integration-lowlevelapi.html

...