2009-08-26 40 views
8

Tôi muốn sử dụng phản hồi tải xuống tệp ASP.NET chuẩn, như in other Stack Overflow question.Cách thực hiện tải xuống tệp trong ASP.NET AJAX

Response.ContentType = "application/octet-stream"; 
Response.AppendHeader("Content-Disposition","attachment; filename=logfile.txt"); 
Response.TransmitFile(Server.MapPath("~/logfile.txt")); 
Response.End(); 

Nhưng bên trong bảng cập nhật, nó không hoạt động. Những gì tôi phải làm, rằng tôi sẽ nhận được một tập tin nếu sự kiện tải về được kích hoạt bên trong bảng cập nhật?

+0

Tôi tò mò là tại sao bạn không chỉ tạo URL trỏ đến tệp bạn muốn cung cấp cho khách hàng và cung cấp cho trình duyệt để sử dụng để tải xuống tệp của bạn. ? – 7wp

+0

Đây là tệp txt, thường được hiển thị trực tiếp trong trình duyệt. Nếu loại nội dung được đặt thành "application/octet-stream", tôi đoán trình duyệt sẽ bắt đầu tải xuống đĩa thay thế. – awe

+0

Tệp "txt" tốt chỉ là một ví dụ. Và nó không được hiển thị trực tiếp trong trình duyệt. Với phản hồi này, nó luôn có thể tải xuống được. –

Trả lời

2

Bạn cần phải có điều này trong một aspx riêng biệt không sử dụng ajax. Ajax đang cập nhật đánh dấu html hiện có trên một trang ở phía máy khách. Những gì bạn thử ở đây là thay thế nội dung phản hồi ở phía máy chủ trước khi gửi bất kỳ thứ gì cho khách hàng.

Bạn có thể thử này:

Có một trang gọi là Download.aspx có chứa mã truyền bạn đã có.

Trong trang ban đầu của bạn, bạn có một cuộc gọi javascript mà các cuộc gọi chuyển sang trang tải như thế này:

window.location.replace('Download.aspx'); 
0

Bạn có thể thử làm một handler cho work.It này là an toàn hơn nếu bạn có thể sửa tốt. Đối với tác phẩm này, bạn cần mã hóa đường dẫn tệp trong trang của mình nơi bạn đặt liên kết cho tệp.

<a href=\"Downloads.ashx?f={0}\" target=\"_blank\">Your link to file</a> 
//{0} -> Encrypted file path 
//target = _blank force browser to download file in another window 

Có rất nhiều kỹ thuật mã hóa trong here

Trong Handler trang của bạn, bạn cần phải giải mã đường dẫn tập tin vào một bản gốc, do đó bạn có thể đọc nó với System.IO thư viện.

context.Response.ContentType = ""; //-->MimeType for your file's extension 

Bạn có thể chỉ định MimeType by Registry trừ khi loại mime của bạn tĩnh như hình ảnh.

string mimeType = Registry.GetValue(string.Format(@"HKEY_CLASSES_ROOT\.{0}", 
        Path.GetExtension(decryptedfilePath)), "Content Type", null).ToString(); 

//Then everything is ready for download 

byte[] buffer = File.ReadAllBytes(decryptedfilePath); 
context.Response.OutputStream.Write(buffer, 0 , buffer.Length); 
context.Response.Flush(); 

Chúc may mắn.

0

tôi đã có thể giải quyết việc này bằng cách gọi một hàm javascript, trong đó kêu gọi __doPostBack không có __EVENTTARGET.

function GxGridView_Export(exportLink, exportType) { 
    var containingGrid = $(exportLink).closest("table .GxGridViewWithSlider"); 
    __doPostBack('', containingGrid.attr('id') + "###" + exportType); 
} 

Lưới phía máy chủ sau đó phân tích cú pháp __EVENTARGUMENT và hiển thị tệp xuất.

var eventArg = Page.Request.Form["__EVENTARGUMENT"]; 
if (!string.IsNullOrEmpty(eventArg) && eventArg.Contains("###")) 
{ 
    var eventParams = eventArg.Split(new string[] { "###" }, StringSplitOptions.RemoveEmptyEntries); 
    if (eventParams.Length == 2 && eventParams[0] == this.ClientID) 
    { 
     ExportGrid(eventParams[1]); 
     return; 
    } 
} 
+0

Ban đầu tôi đã cố gắng chuyển id mạng làm mục tiêu sự kiện, nhưng doPostBack bằng cách nào đó đủ thông minh để biết đó là một điều khiển bên trong bảng điều khiển ajax, và tạo postback ajax thay thế. –

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