2015-12-07 38 views
5

Pobieram plik z Amazon S3. Chcę przekonwertować plik do bajtów, tak że można go pobrać w następujący sposób:Jak mogę uzyskać bajty GetObjectResponse od S3?

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

Mam plik tutaj:

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

wiem o response.WriteResponseStreamToFile(), ale chcę, aby pobrać plik do zwykłego folderu pobierania. Jeśli skonwertuję GetObjectResponse na bajty, mogę zwrócić plik. Jak mogę to zrobić?

Odpowiedz

7

Oto rozwiązanie znalazłem dla każdego, kto go potrzebuje:

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

Dziękuję Erica, to działa. –

5

Kolejna opcja:

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" jest czystsze niż trzeba utworzyć metodę "ReadStream (Stream responseStream)", jak w innej odpowiedzi. Możesz również użyć "CopyToAsync" i uczynić metodę asynchroniczną. – Riga