2010-04-22 37 views
8

Tôi phải thực hiện xuất GEDCOM trong trang web của mình.Response.TransmitFile và xóa nó sau khi truyền

Mã .net của tôi đã tạo một tệp tại máy chủ khi xuất sang gedcom được nhấp.

Sau đó, tôi cần tải nó xuống máy khách từ máy chủ, cũng như người dùng nên được hỏi nơi lưu tệp đó, nghĩa là cần phải lưu lại.

Sau khi tải xuống, tôi muốn xóa tệp đó khỏi máy chủ.

Tôi có một mã để truyền tải tập tin từ máy chủ cho khách hàng:

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

từ này LINK

nhưng tôi không thể để xóa các tập tin sau khi mã này như Response.End kết thúc phản ứng vì vậy bất cứ mã bằng văn bản sau khi dòng đó không được thực hiện.

Nếu tôi thực hiện mã để xóa tệp trước Response.End(); thì tệp không được truyền và tôi gặp lỗi.

Trả lời

20

Bất cứ điều gì bạn đặt sau Response.End thắng Không được thực thi vì nó ném một ThreadAbortException để ngừng thực thi trang tại điểm đó.

Hãy thử điều này thay vì:

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 gì và Response.End nào ?? xin vui lòng cho tôi biết sự khác biệt? – Radhi

+0

Response.Flush lực lượng ra bất kỳ đầu ra đệm (nếu có) nhưng không ném ThreadAbortException - phản ứng vẫn còn trong tiến trình. Response.End flushes nhưng sau đó ném một ThreadAbortException mà không thể dừng lại. Đặt mã xóa trong khối Cuối cùng đảm bảo rằng nó sẽ chạy bất kể kết quả là gì. – Josh

+6

Thao tác này không xử lý được tình huống khi người dùng nhấp vào Hủy trong hộp thoại tải xuống tệp. Khi điều đó xảy ra một HttpException được ném với thông báo "Máy chủ từ xa đã đóng kết nối. Mã lỗi là 0x800703E3." sau đó trong khối cuối cùng xóa không thành công với một IOException - "Quá trình không thể truy cập tập tin 'C: \ Windows \ TEMP \ tmp5CA3.tmp' bởi vì nó đang được sử dụng bởi một quá trình khác." Tôi thêm một catch (HttpException) và được gọi là Response.End() bên trong catch và làm việc cho tôi – Colin

2

Nếu tập tin là hợp lý nhỏ, bạn có thể tải nó thành một mảng byte để bạn có thể xóa các tập tin trong khi vẫn có thể gửi dữ liệu:

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

Hi, không Response.TransmitFile và Response.BinaryWrite có bất kỳ sự khác biệt trong performace? – Radhi

+0

@Radhi: Không hẳn. BinaryWrite nhanh hơn tất nhiên khi bạn đã có dữ liệu trong bộ nhớ, nhưng cùng với việc tải dữ liệu thì nó cũng giống như TransmitFile. – Guffa

Các vấn đề liên quan