使用c#从S3 Bucket下载对象

时间:2018-04-02 15:28:54

标签: c# amazon-s3

我试图从面向下方问题的S3存储桶下载对象 请求中包含的安全令牌无效。 请检查并纠正错误的位置。

以下是我的代码 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");
        }
    

2 个答案:

答案 0 :(得分:6)

我们做一些与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
}

答案 1 :(得分:1)

Bucketname, Accesskey and secretkey, I took from web config. You could type manually.

 public void DownloadObject(string imagename)
    {
        RegionEndpoint bucketRegion = RegionEndpoint.USEast1;
        IAmazonS3 client = new AmazonS3Client(bucketRegion);

        string accessKey = System.Configuration.ConfigurationManager.AppSettings["AWSAccessKey"];
        string secretKey = System.Configuration.ConfigurationManager.AppSettings["AWSSecretKey"];            
        AmazonS3Client s3Client = new AmazonS3Client(new BasicAWSCredentials(accessKey, secretKey), Amazon.RegionEndpoint.USEast1);
        string objectKey = "EMR" + "/" + imagename;
        //EMR is folder name of the image inside the bucket 
        GetObjectRequest request = new GetObjectRequest();
        request.BucketName = System.Configuration.ConfigurationManager.AppSettings["bucketname"];      
        request.Key = objectKey;
        GetObjectResponse response = s3Client.GetObject(request);         
        response.WriteResponseStreamToFile("D:\\Test\\"+ imagename);

    }

//> D:\ Test \是本地文件路径。