Saya memiliki halaman yang memungkinkan pengguna untuk mengunduh file yang dihasilkan secara dinamis. Butuh waktu lama untuk menghasilkan, jadi saya ingin menunjukkan indikator "menunggu". Masalahnya adalah, saya tidak tahu cara mendeteksi kapan browser menerima file, jadi saya bisa menyembunyikan indikator.
Saya membuat permintaan dalam bentuk tersembunyi, yang POST ke server, dan menargetkan iframe tersembunyi untuk hasilnya. Ini jadi saya tidak mengganti seluruh jendela browser dengan hasilnya. Saya mendengarkan acara "memuat" di iframe, dengan harapan bahwa itu akan menyala ketika unduhan selesai.
Saya mengembalikan header "Content-Disposition: attachment" dengan file, yang menyebabkan browser menampilkan dialog "Simpan". Tetapi peramban tidak memecat acara "memuat" di iframe.
Salah satu pendekatan yang saya coba adalah menggunakan respons multi-bagian. Jadi itu akan mengirim file HTML kosong, serta file yang dapat diunduh terlampir. Sebagai contoh:
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
Ini berfungsi di Firefox; ia menerima file HTML kosong, menyalakan acara "memuat", lalu menampilkan dialog "Simpan" untuk file yang dapat diunduh. Tetapi gagal pada IE dan Safari; IE memecat acara "memuat" tetapi tidak mengunduh file, dan Safari mengunduh file (dengan nama dan tipe konten yang salah), dan tidak memecat acara "memuat".
Pendekatan yang berbeda mungkin untuk membuat panggilan untuk memulai pembuatan file, lalu polling server sampai siap, lalu unduh file yang sudah dibuat. Tapi saya lebih suka menghindari membuat file sementara di server.
Adakah yang punya ide yang lebih baik?