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

问题描述 投票:1回答:3

有人知道怎么做因为我调查了,但我发现只有错误/不工作的答案我尝试了很多解决方案,但似乎是错误的,比如使用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);
c# amazon-web-services aws-sdk amazon-glacier aws-sdk-net
3个回答
0
投票

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

如果您已安装AWS SDK for .NET和VS,则可以使用download the Repo from Github

S3-Glacier快速介绍

qazxsw poi是亚马逊的低成本长期存储服务。

在冰川术语中,对象称为存档。存储存档的文件夹也称为存储库。它非常简单 - 来自Amazon S3 Glacier

问:Amazon S3 Glacier中的数据是如何组织的?您将数据存储在Amazon S3 Glacier中作为存档。为每个存档分配一个唯一的存档ID,以后可用于检索数据。存档可以表示单个文件,也可以选择将要上载的多个文件组合为单个存档。您将存档上传到保管库。保管库是用于组织数据的归档集合。

将对象上载到S3 Glacier时,对象不会立即显示在Glacier控制台中。您的Glacier控制台每天刷新一次。

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

简单解决方案

在编码之前,请进入AWS控制台并创建S3 Glacier Vault名称“TestVault”。

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

我提供的代码直接来自Glacier FAQ

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

  1. 创建一个新项目(使用模板 - >控制台应用程序(.NET Framework) - 而不是控制台应用程序(.NET Core)并将其命名为AWS SDK for .NET Documentation
  2. 通过ConsoleApp9将AWS SDK添加到您的项目中。单击工具菜单,选择Nuget包管理器,然后单击包管理器控制台。然后键入NuGet package manager command。 对于MAC,请使用Project-> Add Nuget Packages。搜索“AWSSDK.Glacier”并安装它。
  3. 以下是工作代码。您需要将大部分内容复制到Program.cs中并删除默认的“Hello World”代码。你的最终Program.cs代码应该是这样的 Install-Package AWSSDK
  4. 将要上传的文件作为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(); } } } 放到Glacier。您可以将文件放在任何您想要的位置,只需更新代码中的变量c:\Windows\Temp\Test-Archive.txt即可反映位置。
  5. 如果您所在的地区不是USEast1,请在archiveToUpload之后的行上更改AWS区域:

try

  1. 运行程序,它将上传文件。如果您之前安装了AWS SDK,那么它可能会正常工作,您将拥有一个显示您的存档ID的屏幕:var manager = new ArchiveTransferManager(Amazon.RegionEndpoint.YOUR-REGION);
  2. 如果您遇到权限或授权错误 - 请enter image description here。我建议使用凭据文件(顶部的第二个选项)。其他问题可能是错误的Vault Name或它无法在您的计算机上找到该文件。
  3. 当您返回Glacier控制台时,您将看不到任何上传的文件。与s3相比,Glacier成本低,移动缓慢,因此您的Vault内容每天更新一次。

follow these steps on setting up authorization for the AWS SDK

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

希望这有助于您找到成功。


0
投票

也许这会有所帮助

enter image description here

来源= 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);


0
投票

确保您所在的地区一致。在以下代码中,“eu-west-1”用于Connect调用,但“us-west-1”用于authAws.Region。

https://docs.aws.amazon.com/mobile/sdkforxamarin/developerguide/s3-integration-lowlevelapi.html
© www.soinside.com 2019 - 2024. All rights reserved.