2010-04-22 3 views
8

내 사이트에서 GEDCOM 내보내기를 구현해야합니다.Response.TransmitFile을 전송 후 삭제하십시오.

gedcom으로 내 보내면 내 .net 코드가 서버에서 하나의 파일을 생성했습니다.

그런 다음 서버에서 클라이언트로 다운로드해야하며 사용자는 해당 파일을 저장할 위치를 물어야합니다. 즉, savedialog가 필요합니다.

다운로드가 끝나면 서버에서 파일을 삭제하고 싶습니다.

내가 서버에서 클라이언트로 파일을 전송하는 하나 개의 코드있어이 LINK

에서

Response.ContentType = "text/xml"; 
Response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName); 
Response.TransmitFile(Server.MapPath("~/" + FileName)); 
Response.End(); 

을하지만 Response.End로이 코드 후 파일을 삭제할 수 없습니다입니다 코드 작성 무엇 때문에 응답을 종료 그 라인은 실행되지 않습니다.

Response.End(); 전에 파일을 삭제하는 코드를 작성하면 파일이 전송되지 않고 오류가 발생합니다.

답변

20

아무것도 그 시점에서 페이지의 실행을 멈추기 위해서 (때문에), ThreadAbortException가 슬로우되기 (위해) 때문에, 실행되지 않습니다.

대신이 시도 :

string responseFile = Server.MapPath("~/" + FileName); 

try{ 
    Response.ContentType = "text/xml"; 
    Response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName); 
    Response.TransmitFile(responseFile); 
    Response.Flush(); 
} 
finally { 
    File.Delete(responseFile); 
} 
+1

Response.Flush가 수행하는 작업과 Response.End의 작업은 무엇입니까 ?? 차이점을 알려주시겠습니까? – Radhi

+0

Response.Flush는 버퍼링 된 출력을 강제 종료하지만 ThreadAbortException을 발생시키지 않습니다. 응답은 아직 진행 중입니다. Response.End flushes가 종료 할 수없는 ThreadAbortException를 Throw합니다. finally 블록에 삭제 코드를 넣으면 결과에 관계없이 실행됩니다. – Josh

+6

사용자가 파일 다운로드 대화 상자에서 취소를 클릭하는 상황을 처리하지 않습니다. HttpException이 발생하면 "원격 호스트가 연결을 닫았습니다. 오류 코드는 0x800703E3입니다."라는 메시지와 함께 HttpException이 발생합니다. finally 블록에서 IOException으로 삭제가 실패합니다 - "다른 프로세스에서 사용 중이므로 'C : \ Windows \ TEMP \ tmp5CA3.tmp'파일에 액세스 할 수 없습니다." catch (HttpException)를 추가하고 catch.And()를 호출하여 저를 위해 일했습니다. – Colin

2

파일이 비교적 작은 경우 여전히 데이터를 전송할 수있는 상태에서 파일을 삭제할 수 있도록, 당신은 바이트 배열에로드 할 수 있습니다으로 Response.End 원 후 넣어

Response.ContentType = "text/xml"; 
Response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName); 
string path = Server.MapPath("~/" + FileName); 
byte[] data = File.ReadAllBytes(path); 
File.Delete(path); 
Response.BinaryWrite(data); 
Response.End(); 
+0

안녕, Response.TransmitFile 및 Response.BinaryWrite은의 performace에 어떤 차이가 있습니까? – Radhi

+0

@Radhi :별로 요. BinaryWrite는 이미 데이터를 메모리에 보유하고 있기 때문에 빠르지 만 데이터로드와 함께 TransmitFile과 동일한 작업을 수행합니다. – Guffa