1

有人知道该怎么做,因为我已经调查过,但我发现只有错误/不起作用的答案我尝试了很多解决方案,但似乎是错误的,比如使用 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);
4

3 回答 3

1

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

如果您已经安装了适用于 .NET 和 VS 的 AWS 开发工具包,您可以从 Github 下载 Repo

S3-Glacier 快速介绍

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

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

问:Amazon S3 Glacier 中的数据是如何组织的?您将数据作为存档存储在 Amazon S3 Glacier 中。每个存档都分配有唯一的存档 ID,以后可以使用该 ID 检索数据。一个存档可以代表一个文件,或者您可以选择将多个文件合并为一个存档。您将档案上传到保管库中。保管库是用于组织数据的档案集合。

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

Amazon 建议您在开发连接 AWS 服务的 C# 应用程序时使用适用于 .NET 的 AWS 开发工具包。

简单的解决方案

在编写代码之前,请进入您的 AWS 控制台并创建一个名为“TestVault”的 S3 Glacier Vault。

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

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

准备好视觉工作室后,请按照以下步骤操作:

  1. 创建一个新项目(使用模板 -> 控制台应用程序(.NET Framework) - 不是控制台应用程序(.NET Core)并将其命名ConsoleApp9
  2. 通过NuGet 包管理器命令将 AWS 开发工具包添加到您的项目。工具菜单,选择 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 开发工具包,可能会正常工作,并且您将看到一个显示您的存档 ID 的屏幕。: 在此处输入图像描述
  2. 如果您遇到权限或授权错误 - 请按照这些步骤设置 AWS 开发工具包的授权。我建议使用凭据文件(从顶部开始的第二个选项)。其他问题可能是保管库名称错误或在您的计算机上找不到文件。
  3. 当您返回 Glacier 控制台时,您看不到任何上传的文件。与 s3 相比,Glacier 成本低且移动缓慢,因此您的 Vault 内容每天更新一次。

在此处输入图像描述

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

希望这会有所帮助,并且您会成功。

于 2019-04-26T22:15:05.523 回答
0

也许这会有所帮助

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

于 2019-04-24T13:56:14.347 回答
0

确保您的区域是一致的。在以下代码中,“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";        
于 2019-04-25T11:44:26.687 回答