我正尝试从面临以下问题的 S3 存储桶中下载对象 请求中包含的安全 token 无效。 请检查并更正错误的地方。
下面是我的代码 1. 获取临时凭证:
main()
{
string path = "http://XXX.XXX.XXX./latest/meta-data/iam/security-credentials/EC2_WLMA_Permissions";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(path);
request.Method = "GET";
request.ContentType = "application/json";
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
string result = string.Empty;
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
result = reader.ReadToEnd();
dynamic metaData = JsonConvert.DeserializeObject(result);
_awsAccessKeyId = metaData.AccessKeyId;
_awsSecretAccessKey = metaData.SecretAccessKey;
}
}
创建 SessionAWSCredentials 实例:
SessionAWSCredentials tempCredentials = GetTemporaryCredentials(_awsAccessKeyId, _awsSecretAccessKey);
//GetTemporaryCredentials方法:
private static SessionAWSCredentials GetTemporaryCredentials( string accessKeyId, string secretAccessKeyId) { AmazonSecurityTokenServiceClient stsClient = new AmazonSecurityTokenServiceClient(accessKeyId, secretAccessKeyId); Console.WriteLine(stsClient.ToString()); GetSessionTokenRequest getSessionTokenRequest = new GetSessionTokenRequest(); getSessionTokenRequest.DurationSeconds = 7200; // seconds GetSessionTokenResponse sessionTokenResponse = stsClient.GetSessionToken(getSessionTokenRequest); Console.WriteLine(sessionTokenResponse.ToString()); Credentials credentials = sessionTokenResponse.Credentials; Console.WriteLine(credentials.ToString()); SessionAWSCredentials sessionCredentials = new SessionAWSCredentials(credentials.AccessKeyId, credentials.SecretAccessKey, credentials.SessionToken); return sessionCredentials; }
使用 AmazonS3Client 从
S3
获取文件:using (IAmazonS3 client = new AmazonS3Client(tempCredentials,RegionEndpoint.USEast1)) { GetObjectRequest request = new GetObjectRequest(); request.BucketName = "bucketName" + @"/" + "foldername"; request.Key = "Terms.docx"; GetObjectResponse response = client.GetObject(request); response.WriteResponseStreamToFile("C:\\MyFile.docx"); }
最佳答案
我们做了一些更简单的事情来连接 S3(下载和上传)
看起来您采用了更复杂的方法。您应该尝试使用 TransferUtility
代替:
TransferUtility fileTransferUtility =
new TransferUtility(
new AmazonS3Client("ACCESS-KEY-ID", "SECRET-ACCESS-KEY", Amazon.RegionEndpoint.CACentral1));
// Note the 'fileName' is the 'key' of the object in S3 (which is usually just the file name)
fileTransferUtility.Download(filePath, "my-bucket-name", fileName);
注意 TransferUtility.Download()
返回 void,因为它将文件下载到 filePath
参数中指定的路径。这可能与您的预期略有不同,但您仍然可以在之后打开指向该路径的 FileStream
并根据需要操作文件。例如:
using (FileStream fileDownloaded = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
// Do stuff with our newly downloaded file
}
关于c# - 使用 C# 从 S3 Bucket 下载对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49614036/