2013-01-09 39 views
5

Tôi muốn khách hàng tải xuống tệp được lưu trữ trên db của tôi khi nhấp vào nút. Tôi gửi yêu cầu ajax này và mang nó từ phía máy chủ.Yêu cầu tải xuống tệp Extjs Ajax C# MVC

ExtJS:

downloadFile: function (a, b, c) { 
    var feed_id =this.getMyfeedwindow().down('form').getComponent('FeedId').text; 
    Ext.Ajax.request({ 
     url: '/Feed/Download', 
     method: 'GET', 
     params: { 
      fileID: feed_id, //this.form.getComponent('file').value, 
     }, 
     failure: function (response) { 
      alert('failed !'); 
     }, 
     success: function (response) { 
      alert('success!'); 
     }, 
    }); 
}, 

sau đó đáp ứng yêu cầu với khối mã này.

C#:

public void Download(string fileID){ 
    Response.ContentType = "application/force-download"; 
    Response.AddHeader("Content-Disposition", "attachment; Filename=\"Logo1.jpg\""); 
    Response.BinaryWrite(data); 
    Response.End(); 
} 

Khi tôi kiểm tra mạng với con đom đóm, có vẻ như yêu cầu của tôi trở lại thành công với các thông số này.

Cache-Control private 
Content-Disposition attachment; filename="Logo1.jpg" 
Content-Type application/force-download 
Date Wed, 09 Jan 2013 12:51:54 GMT 
Server Microsoft-IIS/8.0 
Transfer-Encoding chunked 
X-AspNet-Version 4.0.30319 
X-AspNetMvc-Version 4.0 
X-Powered-By ASP.NET 
X-SourceFiles =?UTF-8?B?RTpcVXRrdUNhblxQcm9qZWN0c1xURlNcQlRPTVxCVE9NXEZlZWRcRG93bmxvYWQ=?= 

Mặc dù nó trả về thành công, quá trình tải xuống không bắt đầu. Tôi đã đọc rất nhiều câu hỏi và bài viết nhưng hầu hết các câu trả lời đều cho biết thêm tiêu đề bắt buộc tải xuống sẽ giải quyết được vấn đề. Tôi nhớ điểm nào? Cảm ơn.

+1

Bạn đang thực sự yêu cầu điều gì ở đây? Nó không rõ ràng. – Liam

+0

Tải xuống không bắt đầu ở phía máy chủ? Tôi không thể bắt đầu. Trường phản hồi trong Firebug dường như đã được lấp đầy một số dữ liệu nhưng không có tải xuống. – tkcn

Trả lời

2

Để xử lý một Tải bạn nên sử dụng một trong những helper cung cấp

  • System.Web.MVC.FilePathResult
  • System.Web.MVC.FileStreamResult
  • System.Web.MVC.FileContentResult

Hầu hết các lần tôi đang sử dụng số System.Web.MVC.FileStreamResult. Sử dụng nó như

FileStreamResult result = new FileStreamResult(stream, contentType); 
result.FileDownloadName = filename; // name of the downloaded file 

Cập nhậtChỉ cần một số Infos dựa trên chỉnh sửa của bạn

Bạn không thể bắt đầu tải về sử dụng yêu cầu XHR. Nhưng có ít nhất hai cách để bạn có thể làm điều đó:

  • Nếu đường dẫn tệp được sửa và bạn biết đặt top.location.href = "YourPath"; trong trình xử lý thành công của cuộc gọi ajax. [Infos about top.location.href]
  • Nếu bạn tạo tệp khi đang di chuyển và muốn trả lại, bạn nên tạo iframe ẩn và chèn biểu mẫu vào đó rồi thực hiện yêu cầu.
+2

+1. Tôi sử dụng 'tệp trả về (ảnh," hình ảnh/jpg ");' trong đó ảnh là một byte [] từ cơ sở dữ liệu. – A1rPun

+0

@tkcn Tôi đã thêm một số Infos bổ sung về Filedownloads liên quan đến các cuộc gọi AJAX tới bài đăng của tôi. Họ có thể bạn quan tâm. – sra

+0

cảm ơn, tôi đã sử dụng location.href. nhưng nó là tốt để tìm hiểu tùy chọn iframe. cảm ơn.btw nếu bạn downvoted, xấu hổ về bạn. nhưng nếu bạn không, hãy xấu hổ với tôi: D – tkcn

1

Sau một số tìm kiếm, tôi thấy rằng location.href thực hiện tương tự và mở hộp thoại tải xuống. Các tiêu đề giống nhau phải được thêm vào phản hồi đến từ máy chủ. Tuy nhiên, tôi vẫn không biết tại sao cách tiếp cận khác không hoạt động.

var feed_id = this.getMyfeedwindow().down('form').getComponent('FeedId').text; 
location.href = '/Feed/Download?fileID=' + feed_id; 

giải quyết được sự cố của tôi.

+0

nó có thể vượt qua các thông số như thế này. – tkcn

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