2012-04-18 3 views
2

프로젝트에서 나는 ftp 액세스 만 할 수있는 파일에 http 액세스를 제공해야합니다. 이 파일은 파일을 다운로드해야하지만 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'를 사용하는 블록에서도 래핑 해 보았습니까? –

+0

또한 코드가 현재 작동하는 방식으로 메모리에 메모리를 모두로드 한 다음 메모리에서 디스크로 씁니다. 메모리로드를 줄이려면 가끔 디스크에 기록해야합니다. – Origin

+0

나는'CopyTo'가 기본적으로 사용하는 4K 버퍼를 사용하여 입력 스트림에서 곧바로 복사 할 수있는 방법이 있었으면 좋았을 것입니다. –

답변

0

은 당신이 할 수있는 것은 응답에서 웹 클라이언트 엔드의 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

응답 해 주셔서 감사합니다! 나는 큰 파일이 많고 그 과정에서 웹 서버의 저장 공간을 막 으면서 (한 번에 최대 100GB까지) 파일을 스트리밍하지 않고 응답으로 보내고 싶지 않다. 출력 스트림으로 스트리밍하여 메모리를 확보하고 싶습니다. –

+0

대신 서버 메모리를 사용하고 싶습니까? 죄송하지만 컨텍스트 응답에 직접 다운로드를 스트리밍하는 다른 방법을 모르겠습니다. – amaters

관련 문제