2010-01-25 9 views
0

파일 업로드 페이지에 AsyncFileUpload 컨트롤이 있습니다. 사용자가 파일을 탐색하면 업로드 컨트롤이 파일을 메모리로 가져옵니다. 그런 다음 파일을 데이터베이스에 저장하는 다음 코드를 실행하는 업로드 단추가 있습니다.Ajax AsyncFileUpload.FileBytes returns null

파일이 약 500KB 이상이면 컨트롤의 FileBytes 속성이 null을 단순히 반환한다는 것을 알았습니다. 이것은 내 서버에서 발생하지만 로컬에서 응용 프로그램을 실행할 때 정상적으로 실행됩니다.

데이터베이스에 파일을 커밋하기 전에 추가 정보를 작성하려면 사용자에게 문의해야하므로 OnUploadCompleted 이벤트를 처리하지 않습니다.

내 Web.config의이 있습니다 httpRuntime을 maxRequestLength의 = "10000"/>

private void UploadDocument(int mietID) 
{ 
    if (Page.IsValid) 
    { 
     if (mietID > 0) 
     { 
      if (File1.HasFile && File1.FileBytes != null) 
      { 
       string[] docFormats = MIETPConfig.Current.SupportedDocumentFormats; 

       for (short i = 0; i < docFormats.Length; i++) 
        docFormats[i] = docFormats[i].ToUpper(); 

       if (docFormats.Contains(Path.GetExtension(File1.FileName).ToUpper())) 
       { 
        try 
        { 
         byte[] uploadedBytes = File1.FileBytes; 
         DocumentController.CreateDocument(txtLinkText.Text, Path.GetFileName(File1.PostedFile.FileName), uploadedBytes, mietID, (User)Session["User"]); 

         MietpClientScripts.CloseWindow(Page); 
        } 
        catch (Exception) 
        { 
         lblUploadStatus.Text = "There was an error saving the document to the database."; 
        } 
       } 
       else 
       { 
        System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
        foreach (string s in docFormats) 
         sb.Append(s + ", "); 

        sb.Remove(sb.Length - 2, 2); 
        lblUploadStatus.Text = "Invalid file format, only these formats are supported: " + sb.ToString(); 
       } 
      } 
      else 
      { 
       lblUploadStatus.Text = "There was an error saving the document, the document could not be read; it might be too large to upload."; 
      } 
     } 
     else 
      lblUploadStatus.Text = "No Mietp ID to associate document with."; 
    } 
} 

답변

2

나는 완전히 잘 모르겠지만, 내가 FileBytes의 최대 바이트가 사실로 인해 제한되는 것을 상상할 수 많은 파일 업로드가 많은 RAM을 차지합니다. 호스팅 파트너가 제한했을 수 있습니다. 아마도 귀하의 hoster가 <httpRuntime maxRequestLength="XXX" />을 기본적으로 512KB로 설정했을 것입니다.

SaveAs(path)을 사용하여 파일을 저장해보십시오. 이것은 기본적으로 당신이 지금하고있는 일이지만, 파일에 플러시 할 때, 메모리에 전체 파일을 가져 가지 않도록하거나, 원시 콘텐츠에 실제로 액세스해야하는 경우 FileContent을 사용하여 파일 스트림을 잡는 방법을 제어 할 수 있습니다. . <httpRuntime maxRequestLength="XXX" />102400과 같은 것으로 변경하여 호스팅 업체의 기본 설정을 무시하십시오.

+0

죄송합니다. 게시물의 내용을 놓쳐 버렸습니다. maxRequestLength를 10000으로 설정했지만 102400으로 시도했습니다. FileContent에서 스트림을 사용해 보았지만 Length 속성이 올바른 바이트 수를 제공하더라도 읽기 메서드는 아무 것도 반환하지 않습니다. File.SaveAs는 FileBytes가 null 일 때마다 ObjectDisposedException을 제공합니다 (닫힌 파일에 액세스 할 수 없음). –

+0

다음과 같이하면 :'void UploadDocument() {File1.SaveAs (Server.MapPath ("~/myuploadedfile.tmp")); }', 지금 모든 논리 대신; 이 파일을 올바르게 저장합니까? 그렇지 않다면, AJAX 대신에 보통'FileUpload'를 사용할 때 작동합니까? –

+0

아니요, 로직을 제거한 후에도 파일이 저장되지 않습니다. 필자는 FileUpload 컨트롤에 대한 직선 스왑을 수행했으며 모든 문서에서 15MB 크기의 문서를 사용할 때도 정상적으로 작동합니다. –

2

이 문제에 대한 해결책을 찾았습니다. OnUploadComplete 이벤트에서 FileBytes를 세션에 넣고 Button_Click 이벤트에서 검색하십시오. 어떤 이유로 인해 업로드 된 파일 바이트가 두 번째 다시 게시 후 세션에서 지워집니다 ...

이 작품은 나를 위해 작동합니다.

<form id="form1" runat="server" enctype="multipart/form-data" method="post"> 

가 오른쪽에 enctype 및 방법을 설정하지 않은 경우 : 건배 로랑은

+0

좋은 제안 - 내가하려는 일을하는 데 성공한 것 같습니다. 방금 전 일반 FileUpload 컨트롤을 스크립팅했지만. 버튼이 너무 빨리 클릭 될 수 있으며, 특히 큰 파일을 클릭하면 값이 null이 될 위험이 있습니다. 다시 게시가 발생하여 결코 완료되지 않습니다. –

2

당신이 form 태그의 오른쪽 PARAMS를 설정해야합니다 AsyncFileUpload 사용하는 귀하의 페이지 또는 MasterPage에 위치 UploadedComplete는을 절대 실행하지 않으며 FileUpload.FileBytes부터 FileUpload.HasFile은 UploadedComplete 실행 중에 만 true를 반환합니다.

귀하의 페이지에서 올바른 enctype을 설정하지 않았다고 가정합니다.

게다가, AsyncFileUpload의 prevoius 버전이 Chrome에서 작동하지 않았습니다. 2011 년 7 월 버전 (4.1.50731.0)이이 문제를 해결했습니다.