2009-01-07 22 views
5

Mevcut projemizde, kullanıcı tarafından göndereceği bir HTML formuyla özelleştirilebilen bir PDF indirmesi sunuyoruz. PDF'yi dinamik olarak oluşturmak birkaç saniye alır ve bunu görselleştirmek isterim, ör. İndirme işlemi başlayana kadar gönder düğmesini devre dışı bırakarak. Maalesef, indirme işleminin ne zaman başladığını tespit etmenin bir yolunu bulamadım *. Bu yüzden, gönder düğmesinin ne zaman yeniden etkinleştirileceğini bilemezdim.JavaScript'te bir indirme işleminin başlangıcını tespit etmenin bir yolu var mı?

onload etkinliğinin tetikleneceğini umarak zaten HTML formumun hedefi olarak bir IFrame belirtmeyi denedim. Ancak, muhtemelen - PDF'nin bir "Content-disposition: attachment" üstbilgisiyle gönderilmesi ve aslında IFrame'e yüklenmemesidir.

Şu anda düşünebildiğim tek çözüm, PDF'yi sunucuda geçici bir dosyaya oluşturmaktan kaçınmak istiyorum.

*) Bunu açıklığa kavuşturmama izin verin: İndirmenin bitip bitmediğini veya gerçekten başlatılmış olsa bile bilmem gerekmiyor. Tarayıcının kullanıcıya dosyayı açıp kaydetmeyeceğini soracağı noktayı tespit etmek isterim. Tarayıcı, HTTP üstbilgisini aldığında bu olur sanırım.

+0

İndirmenin ne zaman başladığını veya ne zaman tamamlandığını bilmek ister misiniz? Her iki durumda da, geçici bir dosyanın fark yaratacağını düşünmüyorum. İstemci tarafında, dosyanın sunucuda mı yoksa anında mi oluşturulduğunu söyleyemezsiniz. – Prestaul

+0

Yani formu gönderiyorsunuz ve bu gönderime verilen yanıt bir PDF dosyası mı? Duraklama sırasında, tarayıcı sunucudan yanıt beklediği modda mı? bu doğru mu? – Breton

+0

@Breton: doğru! @Pretaul: İndirme işleminin ne zaman başladığını bilmek istiyorum. Bu yüzden, bir geçici dosya oluşturabilir, gizli IFrame'e bir miktar HTML yanıtı verebilir ve ardından temp dosyasını onload işleyicisindeki JavaScript ile getirebilirim. –

cevap

2

Ne istediğinizi, indirilen dosyanın boyutu 0'dan pozitif bir değere dönüştüğünde algılayabilmek. Bildiğim kadarıyla bunu javascript ile yapmak imkansız - istemcinin dosya sistemine erişebilen bir eklentiye ihtiyacınız var.

Şunun için önerilen bir çalışma: İndirme başına bir oturum oluşturun. İstemcinin sunucuyu indirme durumu hakkında sorgulamasını sağlayın. Bu "olmayan", "başlatılmadı", "başlatıldı", "bitti" olabilir. İndirmenin ve bir AJAX çerçevesinin durumunu devam ettirmek ve güncellemek için bazı sunucuların yan çalışmalarına ihtiyacınız var.

+0

Cevabınız için teşekkürler! HTTP yanıt üstbilgisinin ne zaman alınacağını bilerek gerçek indirmeyi (dosyaya) gerçekten umursamıyorum. Henüz ikna oldum, bu javascript ile yapılamaz. –

+0

Önerilen çalışmanız, aradığımdan biraz daha karmaşıktır.Ama sanırım işe yarayacak ve kesinlikle şu ana kadarki en iyi fikir. –

+0

Hala daha iyi bir çözüm olduğuna ikna olmadım. Ama şimdi oturum/durum fikrini uyguladım, bu yüzden bu cevabı kabul ediyorum. Tekrar teşekkürler. –

0

En basit çözüm, zamanı (cömertçe) tahmin etmek ve bu şekilde yapmaktır. Bu bir kırılma, ama istenen etkiyi veriyor. Diğer seçenek, formu göndermek ve jeneratörü geri dönme ayrıntılarını çağıran sayfaya göndermek için Ajax kullanarak formu geri göndermek olabilir. Bu seçenek için http://www.jquery.com/ iyi bir başlangıç ​​olabilir.

4

Yerinde olsaydım, sunucuya bilgi içeren bir AJAX çağrısı yapardım, dosyayı oluşturur, daha sonra javascript dosyasına/id/ne olursa olsun dosya adını döndürür, sonra window.location öğesini download.php gibi bir şey yapar ? id = x (ancak dosya zaten oluşturuldu, bu yüzden sadece başlıkları ayarlıyor ve okuyor) bu noktada gönderimi yeniden etkinleştirebilirsiniz.

+0

Cevabınız için teşekkürler! Tanımladığınız, bahsettiğim ve kaçınmak istediğim "geçici dosya" çözümüdür. –

+0

Ooo, özür dilerim. Tamamen bu kısmı görmedim. –