2017-10-05 2 views
1

À l'aide du package de puces AWSSDK.S3, j'essaie de renvoyer un fichier qui a été extrait d'un compartiment S3. Mon point de départ est basé sur l'exemple donné dans ce SO answer.Comment renvoyer un fichier FileResult à l'aide d'un AmazonS3 ResponseStream?

Exemple code du contrôleur:

public FileResult GetFile(Guid id) 
{ 
    // no using block as it will be disposed of by the File method 
    var amazonResponse = _foo.GetAmazonResponseWrapper(_user, id); 
    // set Response content-length header 
    // set Response content-type header 

    var bufferSize = 1024; 
    var buffer = new byte[bufferSize]; 
    int bytesRead; 

    while ((bytesRead = amazonResponse.ResponseStream.Read(buffer, 0, buffer.Length)) > 0 && Response.IsClientConnected) 
    { 
     Response.OutputStream.Write(buffer, 0, bytesRead); 
     Response.OutputStream.Flush(); 
     buffer = new byte[bufferSize]; 
    }   

    // this will not work (can't read from this stream) 
    return File(Response.OutputStream, "text/plain", "bar.txt"); 
} 

Si j'écris un MemoryStream créer et utiliser dans la boucle while, je vais obtenir un fichier, mais il n'y aura pas de contenu.

La seule façon que j'ai trouvé pour obtenir le contenu du fichier est d'appeler .ToArray() sur le flux comme ceci:

return File(memStream.ToArray(), "text/plain", "foo.txt"); 

est-il un moyen de diffuser en fait un fichier dans le navigateur sans le charger dans la mémoire du serveur web?

Répondre

1

passer le courant avant même

public FileResult GetFile(Guid id) { 
    // no using block as it will be disposed of by the File method 
    var amazonResponse = _foo.GetAmazonResponseWrapper(_user, id); 
    return File(amazonResponse.ResponseStream, "text/plain", "bar.txt"); 
} 

Vous avez déjà montré que vous pouvez lire à partir du flux de réponse. Ensuite, passez le flux de réponse et le résultat du fichier le lira et retournera la réponse.

+0

Cela semble être l'une de ces situations «C'est si évidemment si simple qu'il faut travailler de cette façon». Je n'étais pas sûr du raisonnement pour utiliser un flux intermédiaire comme je suis nouveau dans le monde d'AWS. Je vais essayer et revoir cette question demain, merci! – Jecoms

+0

Bien sûr. Il semblait juste être le code du contrôleur utilisant l'objet HttpResponse. – Jecoms

+0

@Jecoms, je suis corrigé. C'était probablement pour une version antérieure. – Nkosi