2009-10-21 4 views
6

파일 크기가 적어도 1GB 인 대용량 파일을 업로드해야합니다. ASP.Net, C#IIS 5.1을 개발 플랫폼으로 사용하고 있습니다.대용량 파일 업로드 (1GB) -ASP.net

내가 사용하고 있습니다 :

HIF.PostedFile.InputStream.Read(fileBytes,0,HIF.PostedFile.ContentLength) 

사용하기 전에 :

File.WriteAllBytes(filePath, fileByteArray) 

은 현재 내가 설정 한 (나던 여기하지만 System.OutOfMemoryException 예외를 제공)를 httpRuntime에 :

executionTimeout 설정 = "999999"maxRequestLength의 = "2,097,151"(2GB 그게!) useFullyQualifiedRedirectUrl = "참"을, minFreeThreads = "8"minLocalRequestFreeThreads = "4" appRequestQueueLimit = "5000"enableVersionHeader = "true"로 requestLengthDiskThreshold = " 8192 "

또한 내가 maxAllowedContentLength="**2097151**"를 설정 (추측 유일한 IIS7에 대한)

너무 999,999 초에 IIS 연결 시간 제한을 변경했습니다.

나는 메모리에 모든 일을로드하지 않고 심지어 4578KB (Ajaz-Uploader.zip)

답변

0

한번에 복사의 파일을 업로드 할 수 없습니까 : 큰 파일 업로드에 대한

public void CopyFile() 
{ 
    Stream source = HIF.PostedFile.InputStream; //your source file 
    Stream destination = File.OpenWrite(filePath); //your destination 
    Copy(source, destination); 
} 

public static long Copy(Stream from, Stream to) 
{ 
    long copiedByteCount = 0; 

    byte[] buffer = new byte[2 << 16]; 
    for (int len; (len = from.Read(buffer, 0, buffer.Length)) > 0;) 
    { 
     to.Write(buffer, 0, len); 
     copiedByteCount += len; 
    } 
    to.Flush(); 

    return copiedByteCount; 
} 
+0

안녕하세요 manitra, 클라이언트의 CopyFile() 및 서버의 Copy()를 사용해 보았지만 오류가 발생했습니다. 내가 관찰 한 또 한가지는 WriteAllBytes가 "System.Web.Services.Protocols.SoapException : System.Web.Services.Protocols.SoapException"을 제공하는 것보다 3MB의 데이터까지 작동한다는 것입니다. System.Web.Services.Protocols.SoapException : 확장 프로그램을 실행하는 중에 예외가있었습니다 구성 파일에 지정된 ---> System.Web.HttpException : 최대 요청 길이를 초과했습니다 ..... "예외가 발생했습니다. –

0

확인 this blog entry. 또한 여기에 대한 의견을 밝힐 수있는 토론 포럼에 대한 링크가 몇 개 있습니다. 제안은 사용자 정의 Flash/Silverlight 컨트롤에 대해 사용자 정의 HttpHandler를 사용하는 것입니다.

3

내가 봤 발견 - NeatUpload


는 또 다른 솔루션은 클라이언트의 바이트를 읽어 서버로 전송하는 것, 서버가 파일을 저장합니다. 예

서버 : 네임 스페이스에서 - 업 로더, 클래스 - 업로드

[WebMethod] 
public bool Write(String fileName, Byte[] data) 
{ 
    FileStream fs = File.Open(fileName, FileMode.Open); 
    BinaryWriter bw = new BinaryWriter(fs); 
    bw.Write(data); 
    bw.Close(); 

    return true; 
} 

클라이언트 :

string filename = "C:\..\file.abc"; 
Uploader.Upload up = new Uploader.Upload(); 
FileStream fs = File.Create(fileName); 
BinaryReader br = new BinaryReader(fs); 

// Read all the bytes 
Byte[] data = br.ReadBytes(); 
up.Write(filename,data); 
+1

코드를 확인하지 않았습니다. 이것이 작동하는지 확실하지 않고 단지 아이디어를 전하고자했습니다. 포트 20/21 대신 포트 80을 통해 모든 일이 일어나고 있다는 것을 제외하고는 FTP와 거의 같습니다. –

+0

와우! 네가 NeatUpload를 언급 한 것을 기쁘게 생각합니다. 내가 직접 복사본을 가져 와서 내 프로젝트에 쉽게 추가 할 수 있도록 업로드했습니다. 감사. –

-1

난 당신이 Response.TransmitFile를 사용한다고 생각,이 방법은 웹 서버 메모리 파일에로드되지 않습니다, 그것은 웹을 사용하지 않고 파일을 스트리밍 서버 자원.

if (Controller.ValidateFileExist()) 
     { 
      ClearFields(); 
      Response.Clear(); 
      Response.ContentType = "text/plain"; 
      Response.AddHeader("content-disposition", String.Format("attachment; filename={0}", "FileNAme.Ext")); 
      Response.TransmitFile(FileNAme.Ext); 
      Response.End(); 
      Controller.DeleteFile(); 
     } 
+0

메모리에 파일을 열지 않으면 서버가 다운됩니다 !! 모든 점에서 게시 된 다른 모든 솔루션은 작은 파일에서는 작동하지만 1Gig 파일에서는 작동하지 않는 것 같습니다 –

+0

이 방법은 거꾸로 사용할 수 있습니다. 큰 파일을 다운로드하거나 업로드하려면 문서를 찾을 수 있는지 확인하십시오. –

5

가끔씩 1 및 2GB 파일을 업로드해야하는 앱이 있으므로이 앱도 실행 중입니다. 많은 연구 끝에 내 결론은 이전에 언급 한 NeatUpload 또는 이와 비슷한 것을 구현해야한다는 것입니다.

<httpRuntime maxRequestLength=.../> 

킬로바이트 측정하면서

또한,

<requestLimits maxAllowedContentLength=.../> 

바이트 단위로 측정되는 것을 알고. 그래서 당신의 가치는 더 다음과 같아야합니다 maxRequestLength의 설정

<httpRuntime maxRequestLength="2097151"/> 
... 
<requestLimits maxAllowedContentLength="2097151000"/> 
0

는 HTTP 요청 크기의 기본 한계 4메가바이트,보다 큰 파일을 업로드 충분합니다. 설정 파일을 무시하는 것이 없다는 것을 확실히하십시오.

또는 async upload provided by Telerik을 검사 할 수 있습니다. async upload provided by Telerik은 2MB 청크로 파일을 업로드하며 ASP.NET 요청 크기 제한을 효과적으로 우회 할 수 있습니다.

1

나는 그것이 오래된 질문이지만 여전히 답이 없다는 것을 알고있다. 당신은 코멘트에서 볼

<security> 
    <requestFiltering> 

     <!-- 3GB Files/in byte (3072*1024*1024) --> 
     <requestLimits maxAllowedContentLength="3221225472" /> 

    </requestFiltering> 
</security> 

에서

<!-- 3GB Files/in kilobyte (3072*1024) --> 
    <httpRuntime targetFramework="4.5" maxRequestLength="3145728"/> 

이 :

는 web.config 파일에서

,이 추가 :

그래서 이것은 당신이해야 할 것입니다 어떻게 작동하는지. 하나는 sie를 바이트 단위로, 다른 하나는 킬로바이트 단위로 가질 필요가 있습니다. 희망이 도움이됩니다.

관련 문제