2015-12-07 47 views
5

Sto recuperando un file da Amazon S3. Voglio convertire il file in byte in modo che posso scaricare come segue:Come posso ottenere i byte di un GetObjectResponse da S3?

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

ho il file qui:

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

so di response.WriteResponseStreamToFile(), ma voglio scaricare il file nella cartella dei download regolari. Se converto GetObjectResponse in byte, posso restituire il file. Come posso fare questo?

risposta

7

Ecco la soluzione che ho trovato per chiunque altro ne abbia bisogno:

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

Grazie Erica, funziona. –

5

Solo un'altra opzione:

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" è più pulito di quello necessario per creare il metodo "ReadStream (Stream responseStream)" come in un'altra risposta. Inoltre puoi usare 'CopyToAsync' e rendere il metodo async. – Riga