ASP.NET MVC: die Rückkehr der große Mengen von Daten aus FileResult
Ich habe einen Datei-browser-Anwendung in MVC4, die erlaubt, dass Sie zum download ausgewählte Datei aus einem controller.
Derzeit, die FileResult gibt den Stream der Datei, zusammen mit den anderen response-Header. Während dies funktioniert gut für kleinere Dateien, Dateien, die größer sind, erzeugen eine OutOfMemoryException.
Was ich gerne tun möchte, ist zu übertragen Sie die Datei von der Steuerung, ohne die Pufferung im Speicher in einer Weise ähnlich zu HttpReponse.TransmitFile in WebForms.
Wie kann dies erreicht werden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie deaktivieren Sie die response-Puffer, bevor Sie wieder die Datei Ergebnis.
HttpCompletionOption.ResponseHeadersRead
um zu verhindern, dassCannot write more bytes to the buffer than the configured maximum buffer size: 2147483647.
Ausnahme.Ja, Sie können mit Hilfe der Web-Api, um die stream-Datei, nehmen Sie einen Blick auf diese Artikel Der Umgang mit großen Dateien in ASP.NET Web-API
Zusätzlich zu den oben genannten link beschreibt die Konfiguration, die Sie verwenden können TransmitFile auf "stream" - Dateien. Allerdings TransmitFile hat einige rückwärts auf einigen http-clients.
Dies ist mein code zum "streamen" von Dateien auf client-als alternative für TransmitFile. Beachten Sie, dass ich eine config-Konstante, um rollback mit WriteFile (die haben die gleichen OutOfMemory-Problem wie deins) :
Methode nicht code :
Ich habe diesen code, um einige Probleme in streaming-pdf-Dateien zu alten acrobat-reader-plugin. Für die inline-parameter, können Sie "false".
Additionaly, Sie können verwenden von try/catch um diesen code, da jede Antwort.IsClientConnecter/Write/Flush Ausnahmen auslösen kann, wenn client trennen.
Allerdings bin ich nicht mit MVC, und ich bin nicht sicher, ob dies akzeptabel ist für dieses techno, als wenn Sie nicht verwendet haben, TransmitFile, Sie kann geklebt werden, mit dem gleichen Problem mit diesem code.
Wenn Sie versuchen, die embedd-Dateien in web-Seiten-element (als base64-vielleicht ?) dies ist nicht die Lösung.
Lassen Sie mich wissen, mehr Informationen über Ihre Anforderungen, wenn Sie brauchen andere Wege, um Ihre Ziele zu erreichen.