c# - 使用 C# 从 S3 Bucket 下载对象

标签 c# amazon-s3

我正尝试从面临以下问题的 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;
                }
}
  1. 创建 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;
        }
    
  2. 使用 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/

相关文章:

amazon-web-services - 在 AWS EMR 中编辑配置文件

c# - Bang 与 Visual Basic 中的默认属性

c# - 禁用 Entity Framework 的默认值生成(代码优先)

c# - 使用 Marshal.FreeHGlobal() 来释放之前在 native 端分配给 "new"的数组?

node.js - AWS Lambda getSignedUrl 不会为 .txt 文件创建可下载链接,但适用于 .docx

Android 相对布局在 Galaxy S3 上无法正常工作

使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误

javascript - 使用浏览器 JavaScript SDK 检查 AWS S3 上是否存在文件?

c# - 创建跨平台Windows,Mac OS X应用程序

c# - 如何在 C# 中将 DateTime 格式化为 "Oct. 10, 2008 10:43am CST"