2012-04-18 54 views
2

對於我正在工作的項目,我需要提供http訪問文件,我只有ftp訪問權限。這被用作需要下載文件但僅支持http的外部服務。我嘗試了下面的代碼:但CPU /內存使用率是通過屋頂,它慢慢死亡。有什麼建議麼?簡單的ftp下載器/ http代理

using System; 
using System.Web; 
using System.Net; 
using System.IO; 

public class ftpproxy : IHttpHandler 
{ 
    // ftpproxy.ashx?src=ftp://username:[email protected]/staticfiles/foo.f4v 
    public void ProcessRequest (HttpContext context) { 
     WebClient wc = new WebClient(); 
     string src = context.Request.QueryString["src"]; 
     using (Stream instr = wc.OpenRead(src)) 
     { 
      instr.CopyTo(context.Response.OutputStream); 
     } 
    } 

    public bool IsReusable { 
     get { 
      return false; 
     } 
    } 

} 

謝謝!

哦,這些都是大文件(幾百個兆的一對夫婦音樂會)

+0

您是否嘗試過在使用塊中包裝'WebClient'? – 2012-04-18 22:21:04

+0

此外,您的代碼目前的工作方式我相信它會將它全部加載到內存中,然後從內存寫入磁盤。如果你想減少內存負載,你需要偶爾寫入磁盤。 – Origin 2012-04-18 22:26:42

+0

我曾希望有一種方法可以直接從輸入流複製到使用默認使用'CopyTo'的4K緩衝區的輸出流,顯然我誤解了它的工作原理? – 2012-04-18 22:27:52

回答

0

你可以做的是從響應WebClient的結束WriteFile的使用DownloadFile方法。

string src = context.Request.QueryString["src"]; 
var file = "X:\TEMP\TempFile..."; 
WebClient client = new WebClient(); 
client.DownloadFile(src, file); 

Context.Response.WriteFile(file); 

//Write code to clean File; 
+0

感謝您的迴應!我不想將它流式傳輸到文件中,然後傳輸到響應中,因爲有很多大文件,並且在此過程中會扼殺Web服務器的存儲空間(一次最多100GB)。我希望能夠將它流式傳輸到輸出流中,隨時隨地釋放內存。 – 2012-04-26 01:35:24

+0

那麼相反,你想使用服務器內存?對不起,但我不知道任何其他方式直接下載到上下文響應。 – amaters 2012-04-26 07:31:46