2009-11-16 162 views
2

我有幾個應用程序允許用戶上傳存儲在數據庫表內的附件。由於它最初只適用於小圖片文件,因此它可以很好地工作幾年,但現在他們想要上傳非常大的文件(大約80MB)。這導致服務器內存不足(上傳失敗),因爲爲了將二進制數據寫入數據庫,我將整個內容加載到一個字節數組中。許多(如果不是大多數)在線文件上傳示例使用此方法(請參閱http://www.aspnettutorials.com/tutorials/database/Save-Img-ToDB-Csharp.aspx作爲示例)。將上傳的文件直接傳輸到數據庫表中

現在,問題是,我可以以某種方式將二進制內容流式傳輸到數據庫,而不是將整個內容加載到字節數組中,然後將字節數組設置爲參數化值?切換到基於文件而不是基於數據庫的存儲將在這一點上是一個大問題...

回答

1

也許這個article可以指向你正確的方向。

-2

我不認爲這是可行的,以存儲在數據庫中的大文件,特別是通過上傳(我'假設上傳是通過瀏覽器進行的。)

至少,您希望將文件上載到服務器上的保留文件夾,並在完全上傳後將其移入數據庫。否則,你必須弄清楚如何使用多個更新將字節流分塊到數據庫中。我不認爲你可以附加到已經在記錄中的BLOB。

UPDATE:它看起來像我可能是錯誤的分塊。 SQL Server支持UPDATETEXT

我仍然認爲上傳大量文件並將它們「流」到數據庫中的文件是脆弱的,並且存在可靠性問題。

+0

本身有些數據庫支持流(Oracle流的實例),這將允許您通過到RDBMS流的數據,而不會發出多個更新。 – Storm

+0

將文件流式傳輸到數據庫並不像通過瀏覽器上傳大文件的可靠性那麼重要。如果您的耐心用戶在上傳時不會意外關閉瀏覽器,那麼這可能不是什麼大問題。 –

0

對於您使用的環境,除了附加到帖子上的標籤外,您沒有提供太多的信息。

您應該做的是使用數據庫服務器(和您使用的連接層)的流式傳輸功能通過流發送數據。

似乎只支持可搜索的流,因此您應該首先將上傳文件寫入臨時文件(使用流,不要在內存中緩衝文件),然後使用FileStream將文件插入數據庫。

+0

我認爲使用的標籤很好地描述了他的環境。 –

0

您將需要一個客戶端應用程序(Silverlight,Java Applet,Flash等),它們將文件分成小塊並將其發送到服務器;

在服務器上,您需要調用數據庫並保存該塊;在我的測試中,最好的性能來自UPDATETEXT

注意你需要做類似的事情來提供文件下載;我建議閱讀有關READTEXT功能,漂亮比UPDATETEXT相同,並使用它內部的IHttpAsyncHandler