Tôi có một trang cho phép người dùng tải xuống một tệp được tạo động. Phải mất một thời gian dài để tạo, vì vậy tôi muốn hiển thị một chỉ báo "chờ". Vấn đề là, tôi không thể tìm ra cách phát hiện khi trình duyệt nhận được tệp, vì vậy tôi có thể ẩn chỉ báo.
Tôi đang thực hiện yêu cầu ở dạng ẩn, gửi POST đến máy chủ và nhắm mục tiêu iframe ẩn cho kết quả của nó. Điều này là do đó tôi không thay thế toàn bộ cửa sổ trình duyệt bằng kết quả. Tôi lắng nghe một sự kiện "tải" trên iframe, với hy vọng nó sẽ kích hoạt khi quá trình tải xuống hoàn tất.
Tôi trả lại tiêu đề "Xử lý nội dung: tệp đính kèm" với tệp, khiến trình duyệt hiển thị hộp thoại "Lưu". Nhưng trình duyệt không kích hoạt sự kiện "tải" trong iframe.
Một cách tiếp cận tôi đã thử là sử dụng phản hồi đa phần. Vì vậy, nó sẽ gửi một tệp HTML trống, cũng như tệp có thể tải xuống được đính kèm. Ví dụ:
Content-type: multipart/x-mixed-replace;boundary="abcde"
--abcde
Content-type: text/html
--abcde
Content-type: application/vnd.fdf
Content-Disposition: attachment; filename=foo.fdf
file-content
--abcde
Điều này hoạt động trong Firefox; nó nhận được tệp HTML trống, kích hoạt sự kiện "tải", sau đó hiển thị hộp thoại "Lưu" cho tệp có thể tải xuống. Nhưng nó thất bại trên IE và Safari; IE kích hoạt sự kiện "tải" nhưng không tải xuống tệp và Safari tải xuống tệp (với tên và loại nội dung sai) và không kích hoạt sự kiện "tải".
Một cách tiếp cận khác có thể là thực hiện cuộc gọi để bắt đầu tạo tệp, sau đó thăm dò máy chủ cho đến khi sẵn sàng, sau đó tải xuống tệp đã được tạo. Nhưng tôi muốn tránh tạo các tệp tạm thời trên máy chủ.
Có ai có một ý tưởng tốt hơn?