Kullanıcı dinamik olarak oluşturulan bir dosyayı indirmek için izin veren bir sayfam var. Üretilmesi uzun zaman alıyor, bu yüzden bir "bekleme" göstergesi göstermek istiyorum. Sorun şu ki, tarayıcı dosyayı aldığında nasıl tespit edeceğimi bulamıyorum, böylece göstergeyi gizleyebilirim.
Ben sunucuya POSTs ve sonuçları için gizli bir iframe hedefleyen gizli bir formda istek yapıyorum. Bu yüzden tüm tarayıcı penceresini sonuçla değiştirmem. İndirme tamamlandığında patlayacağını ümit ederek iframe'de bir "load" olayı dinliyorum.
Dosyayla birlikte bir "Content-Disposition: attachment" üstbilgisi döndürüyorum, bu da tarayıcının "Kaydet" iletişim kutusunu göstermesine neden oluyor. Ancak tarayıcı iframe'de "yükleme" etkinliğini başlatmaz.
Denediğim bir yaklaşım çok parçalı bir yanıt kullanmaktır. Böylece boş bir HTML dosyası ve ekli indirilebilir dosya gönderir. Örneğin:
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
Bu Firefox'ta çalışır; boş HTML dosyasını alır, "load" olayını tetikler, ardından indirilebilir dosya için "Kaydet" iletişim kutusunu gösterir. Ancak IE ve Safari'de başarısız oluyor; IE "load" olayını tetikler ancak dosyayı indirmez ve Safari dosyayı (yanlış ad ve içerik türüyle) indirir ve "load" olayını başlatmaz.
Farklı bir yaklaşım, dosya oluşturmayı başlatmak için bir çağrı yapmak, daha sonra hazır olana kadar sunucuyu yoklamak ve daha önce oluşturulmuş dosyayı indirmek olabilir. Ancak sunucuda geçici dosyalar oluşturmaktan kaçınmayı tercih ederim.
Daha iyi bir fikri olan var mı?