如何在控制台应用程序中使用 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 准备就绪,请执行以下步骤:
- 创建一个新项目(使用模板 -> 控制台应用程序 (.NET Framework) - 而不是控制台应用程序 (.NET Core) 并将其命名为
ConsoleApp9
通过 NuGet package manager command 将 AWS SDK 添加到您的项目中。
工具菜单,select Nuget 包管理器,然后单击包管理器控制台。
然后输入 Install-Package AWSSDK
.
对于 MAC 使用项目->添加 Nuget 包。搜索 "AWSSDK.Glacier" 并安装它。
下面是工作代码。您需要将其中的大部分复制到您的 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();
}
}
}
将要上传到Glacier的文件设为c:\Windows\Temp\Test-Archive.txt
。您可以将文件放在任何您想要的位置,只需更新代码中的变量 archiveToUpload
以反映位置。
- 如果您的区域不是 USEast1,请在
try
: 之后的行中更改 AWS 区域
var manager = new ArchiveTransferManager(Amazon.RegionEndpoint.YOUR-REGION);
- 运行 程序,它将上传文件。如果您在此之前安装了 AWS SDK,则可能会正常工作,并且您将看到一个显示您的存档 ID 的屏幕:
- 如果您 运行 进入权限或授权错误 - 请 follow these steps on setting up authorization for the AWS SDK。我建议使用凭据文件(顶部的第二个选项)。其他问题可能是保管库名称错误或无法在您的计算机上找到该文件。
- 当您返回 Glacier 控制台时,您将不会看到任何上传的文件。与 s3 相比,Glacier 成本低且移动速度慢,因此您的 Vault 内容每天更新一次。
只要您在第 6 步中获得一个 ID,您的文件就已成功存储在 Glacier 中。
希望这对您有所帮助,您会成功的。
有人知道怎么做吗,因为我调查过,但我只找到 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 准备就绪,请执行以下步骤:
- 创建一个新项目(使用模板 -> 控制台应用程序 (.NET Framework) - 而不是控制台应用程序 (.NET Core) 并将其命名为
ConsoleApp9
通过 NuGet package manager command 将 AWS SDK 添加到您的项目中。 工具菜单,select Nuget 包管理器,然后单击包管理器控制台。 然后输入
Install-Package AWSSDK
.对于 MAC 使用项目->添加 Nuget 包。搜索 "AWSSDK.Glacier" 并安装它。
下面是工作代码。您需要将其中的大部分复制到您的 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(); } } }
将要上传到Glacier的文件设为
c:\Windows\Temp\Test-Archive.txt
。您可以将文件放在任何您想要的位置,只需更新代码中的变量archiveToUpload
以反映位置。- 如果您的区域不是 USEast1,请在
try
: 之后的行中更改 AWS 区域
var manager = new ArchiveTransferManager(Amazon.RegionEndpoint.YOUR-REGION);
- 运行 程序,它将上传文件。如果您在此之前安装了 AWS SDK,则可能会正常工作,并且您将看到一个显示您的存档 ID 的屏幕:
- 如果您 运行 进入权限或授权错误 - 请 follow these steps on setting up authorization for the AWS SDK。我建议使用凭据文件(顶部的第二个选项)。其他问题可能是保管库名称错误或无法在您的计算机上找到该文件。
- 当您返回 Glacier 控制台时,您将不会看到任何上传的文件。与 s3 相比,Glacier 成本低且移动速度慢,因此您的 Vault 内容每天更新一次。
只要您在第 6 步中获得一个 ID,您的文件就已成功存储在 Glacier 中。
希望这对您有所帮助,您会成功的。