2010-12-29 30 views
8

Tôi có một iframe trên trang của mình, và bên trong iframe mà tôi thực thi mã:

$.ajax({ 
    url: '/SamplePage/ExportToExcel', 
    async: false, 
    data: par, 
    type: 'POST' 
}); 

đáp ứng được trả về tốt, tuy nhiên tôi không nhận được hộp thoại 'Lưu tệp đính kèm, không có gì xảy ra ... Để làm cho mọi thứ rõ ràng, tiêu đề là tốt (nội dung bố trí, mime loại vv,), như khi tôi thực hiện xuất khẩu bằng cách sử dụng trình đơn đồng bằng nó hoạt động. Có vẻ như nó có liên quan đến cuộc gọi ajax. Nó có hoạt động không?

Cảm ơn

Trả lời

8

Bạn sẽ không nhận được hộp thoại Lưu dưới dạng khi sử dụng AJAX. Nếu bạn muốn nhận được hộp thoại này chỉ đơn giản là cung cấp một liên kết bình thường đến tập tin tải về:

<a href="/SamplePage/ExportToExcel">download</a> 

hoặc nếu bạn cần một yêu cầu POST:

<form action="/SamplePage/ExportToExcel" method="post"> 
    <input type="submit" value="download" /> 
</form> 

Khi bạn sử dụng AJAX để tải về một tập tin nội dung của tập tin này được lấy ra tại cuộc gọi lại thành công nhưng không có nhiều bạn có thể làm với nó: bạn không thể lưu nó vào máy khách và bạn không thể nhận được hộp thoại Save As.

9

Để mở rộng câu trả lời Darin của, dưới đây là cách tôi đã làm nó:

Tôi có một hình thức ẩn, với một yếu tố đầu vào ẩn sẽ được sử dụng để tự động giữ các giá trị tôi muốn chuyển đổi/xuất khẩu:

<form id="svg_export_form" method="POST" style="display:none;visibility:hidden"> 
    <input type="hidden" name="svg" /> 
</form> 

Sau đó, tôi có mã jQuery này để tự động điền các phần tử với thông số bài đăng và sau đó gửi biểu mẫu.

$('#svg_export_form > input[name=svg]').val(svg_code); 
$('#svg_export_form').attr('action','api/reports/convert/svg/to/png'); 
$('#svg_export_form').submit(); 

Và bởi vì phản ứng trở lại (fro gọi api) có một bộ tiêu đề Disposition Nội dung, hình thức trình hành động sẽ không hướng người dùng ra khỏi trang hiện tại (nhưng chỉ trả về tập tin đính kèm) như một hình thức bình thường nộp và do đó vẫn giữ được ảo tưởng về một trình gửi Ajax điển hình :-)

+0

nemesisfixx - cảm ơn vì phản hồi tuyệt vời này. Câu hỏi nhanh ... Có cách nào để trang gốc biết khi nào tệp đính kèm đã được tải xuống không? Ví dụ: Tôi muốn ngăn người dùng nhấp vào nút tải xuống nhiều lần, vì vậy tôi vô hiệu hóa nó ngay sau khi cô nhấp vào nút đó. Tuy nhiên, khi tải xuống hoàn tất, tôi muốn bật lại (Vì vậy, cô ấy có thể yêu cầu tải xuống khác với cài đặt/đầu vào mới). Điều này có thể được thực hiện? – mattstuehler

+0

@mattstuehler, không chắc chắn về cách tiếp cận thẳng thắn, nhưng u có thể kích hoạt cuộc gọi phía máy chủ đến kết thúc (nghĩ rằng giao thức Comet) cho phép ứng dụng của bạn biết khi tải xuống hoàn tất ở phía máy chủ . Một cách tiếp cận "dễ dàng hơn" có thể là chờ một cửa sổ thời gian cụ thể, sau khi hết hạn, bạn chỉ cần giả định rằng quá trình tải xuống phải hoàn tất và u có thể hiển thị nút (một số thông tin trước về kích thước tệp trung bình của yo có thể giúp ích) . – nemesisfixx

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