[英]MVC 4.5.2 Response.WriteFile larger than 2gb
在后期測試階段,我注意到一個問題,我的應用程序發送的文件大於2 gigs(Int32.MaxValue)。 有沒有一種簡單的方法可以解決這個問題? 這些是大型高清.mov電影文件。 我在我的控制器中使用了Response.WriteFile,以確保瀏覽器不會打開任何文件(大多數是瀏覽器未打開的大型視頻文件,而不是全部)並強制下載以及進行一些日志記錄。
現在我唯一的選擇是使用ajax進行基於javascript的日志記錄並直接鏈接到大型mov文件,但我想避免在開發過程中這么晚改變我的日志記錄方法。 並且真的很喜歡使用一種記錄方法的所有鏈接,無論它們是大型mov文件還是需要使用writefile發送的文件,因此瀏覽器不會為了簡單起見而打開它們。 但似乎我沒有太多選擇。
阻止像這樣的大文件傳輸的邏輯是什么? 在堆棧跟蹤中,我看到Int64大小不是Int32所以為什么它不工作?
我正在使用最新的(?)MVC(4.5.2)和VS2015。
這是我在請求大文件時遇到的錯誤:
[ArgumentOutOfRangeException: The size parameter must be between zero and the maximum Int32 value.
Parameter name: size
Actual value was 4563025348.]
System.Web.HttpFileResponseElement..ctor(String filename, Int64 offset, Int64 size, Boolean isImpersonating, Boolean useTransmitFile, Boolean supportsLongTransmitFile) +3824261
System.Web.HttpWriter.WriteFile(String filename, Int64 offset, Int64 size) +119
System.Web.HttpResponse.WriteFile(String filename, Boolean readIntoMemory) +359
System.Web.HttpResponseWrapper.WriteFile(String filename) +30
這是我的控制器代碼的相關部分
Response.AddHeader("Content-Disposition", "attachment;filename=" + filename);
Response.WriteFile(filePath);
Response.End();
謝謝
N.
編輯:最終代碼如下所示:
using (FileStream fs = new FileStream(serverPath, FileMode.Open))
{
byte[] buffer = new byte[4096];
int count = 0;
Response.AddHeader("Content-Disposition", "attachment;filename=" + filename);
while ((count = fs.Read(buffer, 0, buffer.Length)) > 0)
{
Response.OutputStream.Write(buffer, 0, count);
Response.Flush();
}
}
HttpContext.ApplicationInstance.CompleteRequest();
通常做的是這種情況是使用流下載文件。 因此,在任何時間點,整個文件(2GB!)都不會加載到內存中。 如果只有100個用戶同時請求文件,請考慮這需要多少內存。
您應該做的是通過流( FileStream
)讀取文件來獲取文件,並將此流直接寫入用戶的響應。
像這樣的東西
//assuming you have your FileStream handle already - named fs
byte[] buffer = new byte[4096];
long count = 0;
while ((count = fs.Read(buffer, 0, buffer.Length)) > 0)
{
response.OutputStream.Write(buffer, 0, count);
response.Flush();
}
請參閱此答案 - 將PDF流寫入響應流
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.