7
votes

ASP.NET MVC: Renvoyer de grandes quantités de données de FileSult

J'ai une application de navigateur de fichiers dans MVC4 qui vous permet de télécharger un fichier sélectionné à partir d'un contrôleur.

Actuellement, le fileresult renvoie le flux du fichier, ainsi que les autres en-têtes de réponse. Bien que cela fonctionne bien pour les fichiers plus petits, les fichiers générateurs plus générateurs générent une exception exceptionnelle.

Ce que j'aimerais faire, c'est transmettre le fichier du contrôleur, sans tamponner en mémoire dans une mode similiaire de mode à httpreponse.TransMitFile dans WebForms.

Comment cela peut être accompli?


0 commentaires

3 Réponses :


3
votes

Oui, vous pouvez utiliser API Web afin de diffuser le fichier, jetez un coup d'œil à cet article traiter avec des fichiers volumineux dans ASP.NET Web API


1 commentaires

Question concerne le MVC, pas l'API Web



0
votes

De plus à la configuration de la liaison ci-dessus décrivant la configuration, vous pouvez utiliser TransmitFile pour "flux". Toutefois, Transmitfile a quelques-uns à l'envers sur certains clients HTTP.

Ceci est mon code pour "flux" des fichiers au client, comme alternative pour la transmission. Notez que j'ai une configuration constante à la restauration avec Writefile (qui possède le même problème de mémoire que possible): xxx

code de méthode: xxx

J'ai utilisé ce code pour éviter des problèmes dans la diffusion de fichiers PDF sur le plugin de lecteur ancien Acrobat. Pour le paramètre inline, vous pouvez utiliser "FALSE".

Shazyy, vous pouvez utiliser Essayer / Catch autour de ce code, comme l'une des réponsesClientConnecter / écriture / flush peut lancer des exceptions si le client se déconnecte.

Cependant, je n'utilise pas MVC, et je ne suis pas sûr que cela est acceptable pour cette techno, comme si vous n'avez pas utilisé TransmitFile, vous pouvez être bloqué avec le même problème avec ce code. Si vous essayez d'intégrer des fichiers dans l'élément de pages Web (comme base64 peut-être?) Ce n'est pas la solution.

Faites-moi savoir plus d'informations sur vos besoins, si vous avez besoin d'autres moyens d'atteindre vos objectifs. < / p>


3 commentaires

De plus, le choix de présenter le résultat car "Fichiers de flux" peut ne pas être pertinent dans le contrôleur et peut être déplacé dans la présentation, où vous avez accès à l'objet de réponse. Le contrôleur peut simplement demander à la couche de présentation de diffuser le ... FileStream / nom de fichier?


En réponse à votre «contrôleur peut simplement demander à la couche de présentation de diffuser le ...» Commentaire, comme il serait obligé de servir le flux de la même manière, cela aurait-il simplement introduire le même problème à un endroit différent?


Je ne suis pas un expert MVC, mais je vous suggère de déplacer le problème dans un endroit où vous pouvez le résoudre (c'est-à-dire: un endroit avec accès à l'objet de réponse)



14
votes

Vous pouvez désactiver le tampon de réponse avant de renvoyer le résultat du fichier.

Response.BufferOutput = false;
return File(fileStream, contentType);


3 commentaires

C'est la seule solution (propre) qui a fonctionné pour moi, merci!


Notez que pour des fichiers vraiment volumineux (2GB +), vous devez également définir httpcompletionoption.responseadersread pour empêcher ne peut pas écrire plus d'octets sur la mémoire tampon que la taille tampon maximale configurée: 2147483647. Exception .


Merci. Cela fonctionne dans mon cas pour les fichiers de plus de 170 Mo.