2010-02-01 2 views
1

그래서 큰 UpdatePanel 내부에 테이블과 링크 버튼을 모두 동적으로 생성하는 페이지가 있습니다. 각 링크 버튼을 클릭하면이 메소드가 호출됩니다. 목표는 내 DB에있는 파일을 가리키는 링크를 갖는 것이며, 클릭하면 사용자가 해당 파일을 열거 나 저장할 수 있습니다. 이 정확한 방법은 일반적으로 동일한 설정을 사용하여 내 사이트의 다른 페이지에서 제대로 작동하지만이 하나에 내가 받고 있어요 :ASP.NET 프로그래밍 방식 파일 다운로드

Microsoft JScript 런타임 오류 : Sys.WebForms.PageRequestManagerParserErrorException : 서버에서받은 메시지를 구문 분석 할 수 없습니다. . 이 오류의 일반적인 원인은 Response.Write(), 응답 필터, HttpModules 또는 서버 추적에 대한 호출로 응답을 수정 한 경우입니다. 세부 정보 : '% PDF-1.3 % 10 % ob'근처에서 오류를 구문 분석합니다.

public void downloadFile(int fileID) 
    { 
     using (SurveyDataContext context = new SurveyDataContext()) 
     { 
      try 
      { 
       var file = context.tblFiles.Single(f => f.FileID == fileID); 
       Response.Clear(); 
       Response.Buffer = true; 
       Response.BufferOutput = true; 
       Response.ContentType = file.MIMEtype; 
       Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + file.FileName.Trim() + "\""); 
       Response.AddHeader("Extension", file.FileName.Substring(
        file.FileName.LastIndexOf('.') + 1).ToLower()); 
       Response.BinaryWrite(file.FileData.ToArray()); 

       Response.Flush(); 
       Response.End(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
       Console.WriteLine(e.InnerException); 
      } 
     } 
    } 

내가 뭘 잘못하고 있니? 나는 어떤 반응도하지 않을거야 .Writes 나 뭐. 이 방법은 응답에 유일한 방법입니다. 이 일을해야하는 다른 방법이 있습니까?

답변

0

내가 잘못하고있는 것을 깨달았습니다. 각 링크 버튼에 PostBackTrigger가 있어야합니다. 일단 내가 한 모든 것은 원래의 방식대로 작동했습니다.

0
+0

내가 Response.Flush를 추가 시도하고 도움이되지 않았다. 내 코드와 샘플의 차이점을 볼 수 없다. Response.BinaryWrite를 사용하고 있으며 Response.FileWrite를 사용하고 있지만 FileWrite가 작동하지 않도록 파일 시스템에 파일이 없다. – jamone

0

Look here

당신 아마 설정 나쁜 콘텐츠 형식

+0

콘텐츠 유형이 올바른 경우 해당 애플리케이션/pdf는 특정 사례입니다 – jamone

+0

그리고 다운로드 한 파일을 Javascript로 처리하고 있습니까? –

0

Response.Clear();를 호출 하는가에 여기 샘플 코드가 다음 작동하지 않는 경우, 당신은으로 Response.End 전에 Response.Flush를 시도해야 다른 모든 것들을 정리하기 전에? 그렇지 않은 경우 here's a blog post이 다른 문제 해결에 사용됩니다.

+0

아니요. – jamone

0

이 문제는 Response.Buffer와 Response.BufferOutput을 모두 설정하면 발생한다고 생각합니다. BufferOutput만으로도 원하는 결과를 얻을 수 있습니다.

Response.Buffer를 제거 할 수없는 경우 ContentType = "application/octet-stream"을 설정하고 "Extension"헤더를 주석 처리하여 조금 단순화 해 보겠습니다. 파일 이름 만 확장하면 브라우저에 충분합니다.

+0

방금 ​​제안을 시도했지만 변경 사항이 없습니다. – jamone

0

UpdatePanel 또는 이와 비슷한 것이 있습니까? 그 사건의 경우

당신은 페이지로드에서이 작업을 수행 할 수 있습니다

ScriptManager _scriptManager = ScriptManager.GetCurrent(this.Page); 
_scriptManager.RegisterPostBackControl(Button1);