如何在控制台应用程序中使用 c# 将文件从我的本地计算机上传到 s3 冰川库?

How to upload a file from my local machine to a vault of s3 glacier using c# in a console app?

有人知道怎么做吗,因为我调查过,但我只找到 wrong/don 无效的答案我尝试了很多解决方案,但似乎是错误的,比如使用 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);

也许这会有所帮助

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

确保您所在的区域一致。在以下代码中,"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";        

这是有关 如何在控制台应用程序中使用 C# 将文件从我的本地计算机上传到 s3 冰川库的分步指南?。首先,我想介绍一些基本的背景信息,稍后将在解决方案中使用。如果您精通 S3 Glacier,请随意跳到解决方案。

如果您已经安装了适用于 .NET 和 VS 的 AWS SDK,则可以 download the Repo from Github

S3-Glacier 快速介绍

Amazon S3 Glacier 是亚马逊的低成本长期存储服务。

在 Glacier 术语中,一个对象被称为 Archive。您存储档案的文件夹也称为 Vaults。非常简单 - 来自 Glacier FAQ:

Q: How is data within Amazon S3 Glacier organized? You store data in Amazon S3 Glacier as an archive. Each archive is assigned a unique archive ID that can later be used to retrieve the data. An archive can represent a single file or you may choose to combine several files to be uploaded as a single archive. You upload archives into vaults. Vaults are collections of archives that you use to organize your data.

当您将对象上传到 S3 Glacier 时,这些对象不会立即出现在您的 Glacier 控制台中。您的 Glacier 控制台将每天刷新一次。

亚马逊建议您在开发与 AWS 服务接口的 C# 应用程序时使用适用于 .NET 的 AWS SDK。

简单的解决方案

在编码之前,进入您的 AWS 控制台并创建一个名称为 'TestVault' 的 S3 Glacier Vault。

在这个解决方案的时候(2019 年 4 月),我建议你使用 Visual Studio 2019。这些步骤与 Visual Studio 的早期版本类似。

我提供的代码直接取自 AWS SDK for .NET Documentation

一旦您的 visual studio 准备就绪,请执行以下步骤:

  1. 创建一个新项目(使用模板 -> 控制台应用程序 (.NET Framework) - 而不是控制台应用程序 (.NET Core) 并将其命名为 ConsoleApp9
  2. 通过 NuGet package manager command 将 AWS SDK 添加到您的项目中。 工具菜单,select Nuget 包管理器,然后单击包管理器控制台。 然后输入 Install-Package AWSSDK.

    对于 MAC 使用项目->添加 Nuget 包。搜索 "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,请在 try:
  6. 之后的行中更改 AWS 区域

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

  1. 运行 程序,它将上传文件。如果您在此之前安装了 AWS SDK,则可能会正常工作,并且您将看到一个显示您的存档 ID 的屏幕:
  2. 如果您 运行 进入权限或授权错误 - 请 follow these steps on setting up authorization for the AWS SDK。我建议使用凭据文件(顶部的第二个选项)。其他问题可能是保管库名称错误或无法在您的计算机上找到该文件。
  3. 当您返回 Glacier 控制台时,您将不会看到任何上传的文件。与 s3 相比,Glacier 成本低且移动速度慢,因此您的 Vault 内容每天更新一次。

只要您在第 6 步中获得一个 ID,您的文件就已成功存储在 Glacier 中。

希望这对您有所帮助,您会成功的。