2015-12-07 44 views
5

我正在从Amazon S3中检索文件。我想将文件转换为字节,这样我可以下载它,如下所示:如何从S3获取GetObjectResponse的字节?

var download = new FileContentResult(bytes, "application/pdf"); 
download.FileDownloadName = filename; 
return download; 

我这里有文件:

var client = Amazon.AWSClientFactory.CreateAmazonS3Client(
     accessKey, 
     secretKey, 
     config 
     ); 
GetObjectRequest request = new GetObjectRequest(); 
GetObjectResponse response = client.GetObject(request);   

我知道response.WriteResponseStreamToFile(),但我想下载该文件到常规下载文件夹。如果我将GetObjectResponse转换为字节,我可以返回文件。我怎样才能做到这一点?

回答

7

这里是我发现别人谁需要它的解决方案:

GetObjectResponse response = client.GetObject(request); 
using (Stream responseStream = response.ResponseStream) 
{ 
    var bytes = ReadStream(responseStream); 
    var download = new FileContentResult(bytes, "application/pdf"); 
    download.FileDownloadName = filename; 
    return download; 
} 

public static byte[] ReadStream(Stream responseStream) 
{ 
    byte[] buffer = new byte[16 * 1024]; 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     int read; 
     while ((read = responseStream.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      ms.Write(buffer, 0, read); 
     } 
     return ms.ToArray(); 
    } 
} 
+1

谢谢埃里卡,它的工作原理。 –

5

只是另一种选择:

Stream rs;  
using (IAmazonS3 client = Amazon.AWSClientFactory.CreateAmazonS3Client()) 
{ 
    GetObjectRequest getObjectRequest = new GetObjectRequest(); 
    getObjectRequest.BucketName = "mybucketname"; 
    getObjectRequest.Key = "mykey"; 

    using (var getObjectResponse = client.GetObject(getObjectRequest)) 
    { 
       getObjectResponse.ResponseStream.CopyTo(rs); 
    } 
}  
+0

'ResponseStream.CopyTo'比在其他答案中必须创建方法'ReadStream(Stream responseStream)'更清晰。您也可以使用'CopyToAsync'并使方法异步。 – Riga