2010-02-02 133 views
5

我必須觸發用戶將大文件下載到Web瀏覽器,在此創建要在服務器上傳輸的文件,然後立即將其刪除。我找到了足夠的例子來看看我應該使用Response.TransmitFile還是Response.WriteFile ...但是聽說兩者都存在問題:WriteFile vs TransmitFile傳輸後需要從服務器上刪除的大文件

WriteFile是同步的,但它在發送之前將文件緩衝在內存中給用戶。由於我正在處理非常大的文件,這可能會導致問題。

TransmitFile不在本地進行緩衝,因此它對大文件起作用,但它是異步的,所以在調用TransmitFile後我無法刪除文件。顯然刷新文件並不能保證我可以刪除它?

處理這個問題的最好方法是什麼?

還有BinaryWrite也...我可以循環通過一個文件流,複製它分段?

回答

0

你可以提交文件到磁盤(隨機名等),並開始發送,但添加一個條目到臨時文件名的數據庫表,在你定義的一段時間後,有一些清理工作通過這些數據庫條目,如果磁盤已經老化,則從磁盤刪除該文件。

2

WriteFile是同步的,但它在 發送給用戶之前將文件緩衝在內存中。由於我是 處理非常大的文件,此 可能會導致問題。

我相信你可以通過設置 來禁用緩衝WriteFile Response.BufferOutput = false;

一旦這已被設置爲false,你應該能夠調用WriteFile的無緩衝......

0

WriteFile的用於從服務器下載小文件方法,尺寸參數必須是零之間Int32的最大值,在傳輸文件之前將文件緩存在內存中。 TransmitFile方法用於從服務器下載大文件,並且不會將文件緩衝到內存中。但是,當下載文件時嘗試刪除文件時,會引發異常。下面是在下載文件後刪除文件的代碼。

FileStream fs = new FileStream(@"D:\FileDownLoad\DeskTop.zip", FileMode.OpenOrCreate); 
     MemoryStream ms = new MemoryStream(); 
     fs.CopyTo(ms); 
     context.Response.AppendHeader("content-disposition", "attachment; filename=" + "DeskTop.zip"); 
     context.Response.ContentType = "application/octet-stream"; 
     context.Response.BinaryWrite(ms.ToArray()); 
     fs.Close(); 
     File.Delete(@"D:\FileDownLoad\DeskTop.zip"); 
相關問題