2017-02-27 2 views
0

HTTPHandler의 HTTP 응답을 통해 사용자 지정 형식의 일반 텍스트 파일을 다운로드하려고합니다. 파일은 숫자, 문자 및 "|" 구분 기호로 사용합니다. 파일이 런타임에 생성 중이며 저장되지 않습니다.HTTP 처리기의 응답에서 파일을 다운로드하지 못했습니다.

손잡이는 자바 스크립트 함수 데이터를 반환하는 데 사용되는 상기 파일을 다운로드 할 때 이에 응답하여 폐쇄 될 수 없다.

현재이 파일을 다운로드하는 데 사용되는 코드입니다.

MemoryStream ms = new MemoryStream(); 
TextWriter tw = new StreamWriter(ms); 
tw.Write(file1); 
byte[] bytes = ms.ToArray(); 
ms.Close(); 

context.Response.Clear(); 
context.Response.ContentType = "text/plain"; 
context.Response.AddHeader("content-disposition", "attachment; filename=file.15"); 
context.Response.AppendHeader("Content-Length", bytes.Length.ToString()); 
context.Response.BinaryWrite(bytes); 

context.Response.Flush(); 
context.Response.Close(); 

context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(new { success = "true", message = "File1 Done", File1 = query["File1"], File2 = query["File2"] })); 

그러나이 코드를 실행하면 오류 (서버 쪽과 클라이언트 쪽 모두)가없고 파일이 다운로드되지 않습니다.

+2

왜 폐쇄하고 세척 후에는 응답을 작성하려면 어떻게해야합니까? –

+0

.aspx 페이지의 자바 스크립트 코드로 다시 데이터를 보내려고합니다. 내가 핸들러와 Requests/Responses가 작동하는 방식이 아직 비교적 새롭기 때문에 나는 파일을 출력하거나 닫고 응답을 끝내는 모든 예제처럼 이것을하는 방법을 잘 모르고있다. 따라서이 처리기를 사용하여 두 작업 (파일 다운로드 및 데이터 반환)을 수행하는 데 어려움을 겪고 있습니다. – user3148942

+0

당신은 단순히 그렇게 할 수 없습니다. –

답변

0

응답을 사용하여 파일을 다운로드하려면 응답을 닫아야하므로 처리기를 사용하여 두 작업을 수행하는 것은 불가능합니다 (Patrick Hofman의 설명에 명시된 것처럼).

해결책으로 처리기는 파일에 대한 바이트 스트림 (또는 문자열)을 응답에 쓰고 JavaScript를 통해 다운로드 할 수 있습니다. 처리기에 다음 코드를 사용하여

:

context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(new { success = "true", message = "File1 Done", File1 = File1, File2 = File2 })); 

데이터를 반환하기 위해 다음 자바 스크립트에서이 코드를 사용 :

function Download(response) {   
     DownloadFile("File1.15", response.File1); 
     DownloadFile("File2.15", response.File2);   
    } 
function DownloadFile(filename, data) { 
     var blob = new Blob([data], { type: 'text/plain' }); 
     if (window.navigator.msSaveOrOpenBlob) { 
      window.navigator.msSaveBlob(blob, filename); 
     } 
     else { 
      var elem = window.document.createElement('a'); 
      elem.href = window.URL.createObjectURL(blob); 
      elem.download = filename; 
      document.body.appendChild(elem); 
      elem.click(); 
      document.body.removeChild(elem); 
     } 
    } 

는 파일을 다운로드합니다.

이 (예 : 성공과 메시지로) 핸들러 내부에서 발생하는 하나의 핸들러 호출뿐만 아니라 반환 다른 정보와 여러 파일을 다운로드 할 수있는 가능성을 제공합니다. Download 메서드는 핸들러가 성공적으로 반환 될 때 호출됩니다.

그러나 사이트에서 브라우저에서 여러 파일 권한을 다운로드해야합니다.