2009-08-28 2 views
0

저는 Excel 스프레드 시트를 생성하고 응답 (콘텐츠 처리 헤더)에서 보내는 ASP.NET 페이지가 있습니다. 그 부분은 잘 작동하지만 원본 페이지가 응답의 일부가 아니기 때문에 절대로 다시 사용할 수없는 단추가 있습니다. 나는 응답을 삭제하고 대신 AddHeader의 AppendHeader를 사용하지만, 응답이 여전히 파일이 포함되지 시도HTTP 응답으로 파일과 페이지를 보내려면 어떻게해야합니까?

Public Shared Sub WriteToResponse(ByVal theWorkBook As Workbook, ByVal FileName As String, ByVal resp As HttpResponse) 
    Dim theStream As New System.IO.MemoryStream() 
    theWorkBook.Save(theStream) 

    Dim byteArr As Byte() = DirectCast(Array.CreateInstance(GetType(Byte), theStream.Length), Byte()) 

    theStream.Position = 0 
    theStream.Read(byteArr, 0, CInt(theStream.Length)) 
    theStream.Close() 

    resp.Clear() 
    resp.AddHeader("content-disposition", "attachment; filename=" & FileName) 
    resp.BinaryWrite(byteArr) 
    resp.End() 
End Sub 

:

여기 내가 사용하는 기능입니다.

무엇이 누락 되었습니까? 다른 헤더를 사용해야합니까? 나는 이것을 발견했다 unanswered question on the ASP.NET forums; 내 문제 같아.

답변

2

수 없습니다. 버튼을 클릭 할 때 팝업을 열어 가짜를 만들 수 있으며 팝업을 파일에 제공하고 자바 스크립트에서 페이지를 다시 게시 할 수 있습니다. 그러나이 방법으로 효과적으로 2 개의 요청으로 2 개의 응답을 생성 할 수 있습니다.

업데이트 : 다운로드를 시작하고 다운로드를 시작하자마자 버튼을 비활성화하려는 경우 실제로는이 작업을 수행 할 수 없지만 그렇게하려면 약간의 속임수를 사용할 수 있습니다. 그들이 다운로드 버튼을 클릭하면 버튼을 비활성화하고 파일 스트리밍을 시작하는 팝업을 만들기 위해 일부 자바 스크립트를 사용합니다. Filestreaming 함수 (WriteToResponse)가 사용자 세션에서 일부 값을 반환 할 때. 그 동안 원래 페이지에서 AJAX를 사용하여 서버를 폴링하여 세션 값이 설정되어 있는지 확인하십시오. 설정되어 있으면 버튼을 다시 활성화하고 빈 값 또는 false 값을 다시 설정합니다 (두 번째로 작동 함). 그러나 이것은 많은 트릭처럼 보입니다.

하지만이 경우에는 치료가 더 나쁘다고 생각합니다. 파일을 생성하는 데 시간이 좀 걸리므로 사용자가 파일을 준비하는 동안 버튼을 눌러서 흐름을 재설정하지 않기를 원한다고 가정합니다. 이를 달성하기 위해 버튼 누르기 페이지에 팝업 메시지가 나타납니다. "다운로드가 준비 중입니다. 잠시 시간이 걸릴 수 있습니다. 기다려 주셔서 감사합니다. (이 메시지를 닫으려면 클릭하십시오.)"

2

동일한 응답으로 파일과 새 페이지를 다시 보낼 수 없습니다.

나는 솔루션이 특정 요구에 맞는 방법을 잘 모르겠지만, 그래서 (당신이 사용하거나 파일 생성 요청이에 서버를 를 전송 바로 전에 버튼을 비활성화 자바 스크립트를 사용할 수있는 기억, 스프레드 시트 다운로드가 시작될 때까지 버튼은 이미 원하는 상태가됩니다.

관련 문제