2015-12-07 3 views
5

Ich erhalte eine Datei von Amazon S3. Ich möchte die Datei in Bytes konvertieren, so dass ich sie herunterladen können, wie folgt:Wie kann ich die Bytes einer GetObjectResponse von S3 bekommen?

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

Ich habe die Datei hier:

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

Ich weiß über response.WriteResponseStreamToFile(), aber ich möchte zum Download die Datei in den regulären Download-Ordner. Wenn ich die GetObjectResponse in Bytes umwandele, kann ich die Datei zurückgeben. Wie kann ich das machen?

Antwort

7

Hier ist die Lösung, die ich für jemand anderen gefunden, der es braucht:

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

Danke Erica, es funktioniert. –

5

Nur eine weitere Option:

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

Das 'ResponseStream.CopyTo' ist sauberer als die Methode 'ReadStream (Stream responseStream)' wie in anderen Antworten zu erstellen. Sie können auch 'CopyToAsync' verwenden und Methodenasync ausführen. – Riga