2009-11-27 7 views
3

Asp.Net에는 파일 업로드에 대한 상한이 있습니다. 나는이 상황을 서버 측에서 잡으려고한다. 찾은 문서에 따르면 Global.asax에서 Application_Error를 재정의 할 수 있어야하지만 나에게 적합하지 않습니다. 두 번째 옵션은받는 페이지의 OnError를 재정의하는 것이지만 작동하지 않습니다.큰 파일로 캐치 업로드

아무도 서버 쪽에서이 오류를 잡는 방법에 대한 몇 가지 작업 코드를 표시 할 수 있습니까?

답변

0

오류를 잡는 대신 web.config 파일에 지정된 최대 크기와 비교하여 파일 크기를 확인할 수 있습니까? 당신은이 최대 크기를 얻을 수를 사용할 수 있습니다 : "사람이 서버 측에서이 오류를 잡는 방법을 에 대한 몇 가지 작업 코드를 표시 할 수 있습니다"

System.Configuration.Configuration config = WebConfigurationManager.OpenWebConfiguration("~"); 
HttpRuntimeSection section = config.GetSection("system.web/httpRuntime") as HttpRuntimeSection; 
double maxFileSize = section.MaxRequestLength; 
+1

IIS가 이전에 업로드를 가로 채기 때문에 코드에 도달하지 않습니다. – Achim

+0

위 코드를 어디에 두어야합니까? – Fermin

+2

위의 코드를 어디에 사용할 수 있습니까? – Rod

0

아니요. 코드를 시작하기 전에 발생하기 때문에 코드를 사용하여이 오류를 포착 할 수는 없습니다.

내가 아는 한이 오류에 대한 대체 오류 페이지를 지정할 수도 없으며 웹 서버는 너무 큰 경우 요청을 받아들이지 않습니다.

+0

web.config에서 최대 업로드 크기를 늘리면 정상적으로 작동합니다. 따라서 업로드는 asp.net 런타임의 일부분에 의해 차단되어야합니다. 그리고 어떻게 든 그 지점을 잡을 수 있어야합니다. 동의하니? – Achim

+0

@Achim : 제한을 너무 높게 설정하여 실제로 제한을 제거하면 코드를 검사 할 수는 있지만 서버는 DoS 공격에 매우 취약합니다. 누군가는 몇 번의 큰 업로드를 시작할 수 있으며 서버의 모든 RAM을 모두 소모합니다. – Guffa

+0

아니요, 코드가 실행되는 위치와시기에 달려 있습니다. 내가 말한 것은 : 제한이 asp.ne 런타임에서 구성되면 asp.net 런타임에서도 처리된다는 것입니다. 따라서 요청은 적어도 asp.net에 도달하고 그 전에 IIS에 의해 차단되지 않습니다. 그리고 어떻게 든 asp.net에서 그것을 잡을 수 있어야합니다. 내가 언급 한 장소에서 가능해야하는 문서에 따르면 - 그러나 그것은하지 않습니다!? – Achim

1

Uploadify은 다운로드 할 파일의 최대 크기를 지정할 수있는 jquery 및 플래시 업 로더입니다. 이 방법을 사용하면 사용자가 파일을 처음부터 다운로드하지 못하게 할 수 있으며 이후에 파일을 가져 오는 것에 대해 걱정할 필요가 없습니다. Golobal.asax.cs에서 다음

2

넣어 :

void Application_Error(Object sender, EventArgs e) 
     { 
      HttpException ex = Server.GetLastError() as HttpException; 
      if (ex != null) 
      { 
       if ((ex.GetHttpCode() == 500 || ex.GetHttpCode() == 400) && ex.ErrorCode == -2147467259) 
       { 
        Server.ClearError(); 
        Response.Redirect("~/MaximumFileError.aspx", false); 
       } 
      } 
     } 

이 나를 위해 일하지만, 모든 경우에 작동하는지 잘 모르겠어요.

0

먼저 maxRequestLength에 대한 몇 가지 사항을 이해해야합니다. 서버 측 접근 방식 검증을 사용하면 파일 크기를 예측할 수 없습니다. 값을 높게 설정하면 DoS 공격의 위험이 증가합니다. 사용자가 파일을 업로드하면 내가 형태의 내 코드 숨김에서 확인

<httpRuntime maxRequestLength="8192" executionTimeout="3600" /> 

가 maxRequestLength의에 주어진의 절반보다 크지 만,이 검사는 경우 결코 일어나지 않을 수 있습니다 나는 8메가바이트에의 web.config maxRequestLength의 설정 업로드 된 파일의 크기가 예외가 발생하기 때문에 web.config에 지정된 최대 RequestLength보다 커집니다. 이러한 예외는 Global.asax의 수준을 파악해야합니다. System.Web.HttpUnhandledException이 많은 다른 상황에서 발생할 수 있기 때문에 예외가 우리 문제를 식별하는 단어를 포함하고 있는지 확인합니다. 좋은 힌트는 예외가 오는 페이지를 확인하고, 특정 양식을 처리하는지, 양식을 다시 사용자에게 리다이렉션하여 중요한지를 확인하는 것입니다.

void Application_Error(object sender, EventArgs e){ 
Exception wyjatek = Server.GetLastError(); 
     if (wyjatek.InnerException != null && wyjatek.InnerException.Message.Contains("Maximum request length exceeded")) 
     { 
      Server.ClearError(); 
      Response.Redirect("FormWithFile.aspx?alert=Za-duzy-plik"); 
     } 
    } 

Global.asax에서이 예외를 인식하면 경고가있는 페이지 (GET에 있음)로 사용자를 리디렉션합니다. ASPX 페이지의 내 코드 숨김에서

:

우선 내가 웹에서 maxRequestLength의 값을 가져 오지.

protected void InsertButton_Click(object sender, EventArgs e) 
     { 
      if (((FileUpload)FormView1.FindControl("FileUpload1")).HasFile) // WHEN USER WANT TO UPLOAD FORM WITH FILE (its, optional) 
      { 
       HttpPostedFile file = (HttpPostedFile)(((FileUpload)FormView1.FindControl("FileUpload1")).PostedFile); 
       int iFileSize = file.ContentLength; 
       if ((file != null) && (file.ContentLength > 0)) 
       { 
        if (iFileSize > maxFileSize) // checking image SIZE! 
        { 
         MessageForUser.Text = "<h1 class=error>Bad File! File is to big!</h1>"; 
        } 
        else 
        { 
         byte[] plik = ((FileUpload)FormView1.FindControl("FileUpload1")).FileBytes; 
       // HERE COMES CODE FOR INSERT OF FORM WITH FILE 
         MessageForUser.Text = "<h1>Insert was sucessfull</h2>"; 
        } 
       } 
      } 
      else 
      { 
       // HERE COMES CODE FOR INSERT OF FORM WITHOUT FILE 
       MessageForUser.Text = "<h1>Insert was sucessfull</h2>"; 
     } 
    } 

이를 Page_Load에서 나는에서 GET으로 제공하여 통신 PIN이하는 방법도 정의 :이 나무 라인으로 설정, 반은 다음과 같이

static System.Configuration.Configuration config = WebConfigurationManager.OpenWebConfiguration("~"); 
static HttpRuntimeSection section = config.GetSection("system.web/httpRuntime") as HttpRuntimeSection; 
int maxFileSize = (section.MaxRequestLength/2)*1024; 

은 다음 삽입 버튼과 연결 동작에서, 나는 계속 Global.asax는 사용자에게 무슨 일이 일어 났는지 알려줍니다. 아직

  1. , 우리는 매우 늦게 이미 우리가 서버의 수준에서 처음으로 인식 무엇 8메가바이트 파일과 서비스 거부 공격을 할 수 있습니다 :

    if (Request.QueryString["alert"]!=null) 
          { 
           string temp = Request.QueryString["alert"].Replace('-',' '); 
           MessageForUser.Visible = true; 
           MessageForUser.Text = "<h1 class=error>ERROR: " + temp + "</h1>"; 
          } 
    

    이 솔루션은 물론 단점이있다.

  2. Global.asax에서 리디렉션되는 경우 사용자 양식의 상태가 손실되지만 일부 코드는이를 극복 할 수 있습니다.
  3. 서버 측의 점검으로 인해 사용자 expirience가 다소 좋지 않으며 많은 사용자의로드로 인해 응용 프로그램이 느려질 수 있습니다. Temporarly 서버에
  4. 는 8메가바이트보다 더 큰 파일을 제공하지만, executionTimeout 설정에서 관리하는 그런는

가능한 대안 :

  1. 파일 크기
  2. 에게 클라이언트 측에서 확인하려면 몇 가지 플래시 기술을 사용하여 작은 스트림에 기술을 사용하여 작은 패킷으로 비트를 전송하고, 주어진 임계 값에 도달하면 자신의 예외를 던져 처리하십시오. 올바른 읽기 : Sending File in Chunks to HttpHandler