簡體   English   中英

MVC 4.5.2 Response.WriteFile大於2gb

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM