2010-07-08 53 views
4

我的客戶端正在通過應用程序上傳超過1 GB的文件。我知道我只能使用asp.net MVC應用程序只上傳100MB。如何在ASP.NET MVC中上傳文件大小1.25GB

public static byte[] ReadStream(Stream st) 
    { 
     st.Position = 0; 
     byte[] data = new byte[st.Length]; 
     . 
     . 
     .   
     . 
} 

我在byte[] data = new byte[st.Length];因爲st.Length=1330768612 錯誤得到錯誤 - 「型 '的System.OutOfMemoryException' 的異常被拋出。」

有什麼辦法可以上傳更多1GB文件? 爲什麼我們可以在webconfig中定義maxRequestLength = 0 - 2097151,

+3

你怎麼知道你只能上傳100MB? – Noldorin 2010-07-08 07:46:12

+1

你不能使用塊? – 2010-07-08 07:46:57

+0

@Noldorin - +1,我會問只有... – Krunal 2010-07-08 07:47:15

回答

0

我記得在一個較老的項目中,我們必須找出一種方法來允許用戶上傳我們ASP.NET Web應用程序的2-4gb文件。

如果我沒有記錯,我們使用「文件上傳控制」和編輯的web.config文件以允許更大的文件大小:

<system.web> 
    <httpRuntime executionTimeout="2400" maxRequestLength="40960" /> 
</system.web> 

另一種選擇是使用HTTP模塊:

http://dotnetslackers.com/Community/blogs/haissam/archive/2008/09/12/upload-large-files-in-asp-net-using-httpmodule.aspx

+0

謝謝@@ Dal ..我正在配置文件 Pankaj 2010-07-08 07:54:41

+0

@Pankaj - ooo對此設置對不起,忘了你的最後一行:) – Dal 2010-07-08 07:56:02

3

IMO你需要使用正確的工具進行工作。 Http根本不打算傳輸像這樣的大文件。爲什麼不使用ftp呢,也許你可以在那裏構建一個web界面。

+0

我同意,需求需求一個不同的工具 – 2010-07-08 08:22:41

+0

你不認爲這可能會導致問題?如果你想使用一個web界面,將文件放在FTP上,你仍然會使用http。當你想要做到這一點時,你必須使用插件(Java小程序,Flash,SilverLight但不是那麼容易)來真正使用FTP,因爲你不能依靠瀏覽器上傳到FTP(afaik只有IE可以用來放置文件在FTP上,因爲它可以使用explorer.exe來顯示FTP內容)。其他缺點是您可能需要在FTP上授予用戶訪問權限(或以某種方式提供設置)。 – Gertjan 2010-07-08 09:45:53

+0

有整個應用程序類別,如文檔管理,WCM,所有類型的在線服務,需要能夠上傳大文件,並且不能使用FTP。此外,問題不是工具或MVC,它只是幾行代碼中的一個錯誤。 – 2010-07-08 11:17:15

1

顯示給您的錯誤表明服務器沒有足夠的內存來處理內存中的文件。驗證你的服務器是否有足夠的內存來分配這麼大的數組/文件。

你也可以嘗試處理流的chunck。出現內存不足表明該文件已發送到服務器,但服務器無法處理該文件。

我真的認爲它與你分配的數組大小有關。它只是不適合你機器的內存(在分配給.NET的內存中)。

1

錯誤提示您嘗試在內存中分配1GB字節數組時出現內存不足的情況。這與MVC無關。您還應該注意,32位進程的內存限制爲2GB。如果您的服務器運行32位操作系統,並且您爲其分配1GB的內容,則會很快耗盡可用內存。

不是試圖讀取內存中的整個流,而是使用Stream.Read使用合理大小的緩衝區讀取塊中的數據,並使用Write調用將塊存儲到文件流中。您不僅可以避免OutOfMemoryExceptions,您的代碼也將運行得更快,因爲在將其存儲到文件之前,您無需等待整個1GB的加載。

代碼可以是如此簡單:

public static void SaveStream(Stream st,string targetFile) 
{ 
    byte[] inBuffer = new byte[10000]; 

    using(FileStream outStream=File.Create(targetFile,20000)) 
    using (BinaryWriter wr = new BinaryWriter(outStream)) 
    { 
     st.Read(inBuffer, 0, inBuffer.Length); 
     wr.Write(inBuffer); 
    } 
} 

你可以調整緩存大小來平衡吞吐量(您上傳的速度有多快,節省)與可擴展性(可以有多少客戶處理)。

0

我會建議使用FTP或寫一個小的桌面應用程序。 HTTP從未打算髮送這樣的大文件。