2012-08-23 23 views
5

Tôi có tệp ashx với IHttpHandler. Khi tôi đăng một số dữ liệu cho IHttpHandler này, tôi thực hiện một số công việc, tạo một tệp và sau đó muốn tệp đó được trả về cho người dùng để họ có thể lưu tệp qua trình duyệt của họ.Viết tệp cho HttpResponse, trình duyệt không nhắc lưu

Với các tập tin được tạo ra, đây là cách tôi cố gắng để ghi các file lại với phản ứng:

HttpResponse response = context.Response; 
response.ClearContent(); 
response.Clear(); 
response.ContentType = "application/octet-stream"; 
response.AddHeader("Content-Disposition", "attachment; filename=MYFILE.EXT"); 
response.WriteFile("C:\tempstuff\MYFILE.EXT"); 

Trong một khối finally sau này, tôi sẽ gọi:

response.End() 

Khi tôi gọi Handler này, không có gì xảy ra cả. Phản hồi 200 được trả về, không có lỗi nào được ném - nhưng trình duyệt sẽ không nhắc người dùng lưu tệp này.

Đây là những gì phản ứng, như bắt bởi Fiddler, trông giống như:

HTTP/1.1 200 OK 
Server: ASP.NET Development Server/10.0.0.0 
Date: Thu, 23 Aug 2012 12:12:19 GMT 
X-AspNet-Version: 4.0.30319 
Content-Disposition: attachment; filename=MYFILE.EXT 
Cache-Control: private 
Content-Type: application/octet-stream 
Content-Length: 781053 
Connection: Close 

[raw content of the file here] 

Phản ứng này có vẻ đúng với tôi. Nó chứa nội dung của tập tin - tuy nhiên theo bất kỳ trình duyệt chính nào, không có hộp thoại tập tin nào nhắc tôi lưu tệp.

Tôi đang làm gì sai ở đây?

Cập nhật: Trong trường hợp trợ giúp, đây là nơi tôi đang sử dụng JavaScript từ ứng dụng web của tôi để gọi HttpHandler này.

$.ajax({ 
    type: 'POST', 
     url: ashxUrl, 
     data: postData, 
     success: function (result) { 
      // Doin' stuff on success 
     }, 
     error: function (error) { 
      // Doin' stuff on error. 
     } 
}); 
+0

Tôi đã thử chính xác điều tương tự. Tôi đã tạo một trang đơn giản 'Download.ashx' với đoạn mã ở trên, và POSTED tới nó từ một trang khác,' Default.aspx'. Trong cả ba trình duyệt (IE, FF, Chrome), nó hoạt động hoàn hảo và tôi nhận được hầu hết các tiêu đề chính xác tương tự trong Fiddler. Bạn không chắc chắn những gì khác có thể xảy ra? – mellamokb

+0

Thú vị! Có lẽ nó sẽ giúp mô tả JavaScript của tôi, nơi tôi đang thực hiện một cách rõ ràng cuộc gọi yêu cầu này. Tôi sẽ chỉnh sửa bài đăng chính để bao gồm đoạn mã này. EDIT: Tôi đã thêm đoạn mã JS. –

+6

Ah. Có điều đó giúp. Bạn không thể thực hiện [tải xuống tệp qua AJAX] (http://stackoverflow.com/questions/4814877/how-to-download-file-via-ajax-with-http-post-ie-some-info-in -thân hình). Bạn sẽ cần một giải pháp thay thế [như thế này] (http://stackoverflow.com/questions/3499597/javascript-jquery-to-download-file-via-post-with-json-data). – mellamokb

Trả lời

2

Bạn đã nói rằng bạn muốn kết quả của cuộc gọi web được cung cấp cho javascript của bạn. Nó sẽ vô cùng khó chịu nếu điều đó khiến trình duyệt nhắc bạn lưu nó, vì thế tất cả AJAX sẽ là không thể.

Bạn muốn chính trình duyệt thực hiện cuộc gọi. Đối với một GET đó sẽ là một vấn đề đơn giản của thiết lập self.location.href. Đối với POST, cách dễ nhất thông thường là điền vào biểu mẫu ẩn với dữ liệu và sau đó là submit().

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