मेरे पास एक पृष्ठ है जो उपयोगकर्ता को गतिशील रूप से उत्पन्न फ़ाइल डाउनलोड करने की अनुमति देता है। इसे उत्पन्न होने में लंबा समय लगता है, इसलिए मैं "प्रतीक्षा" सूचक दिखाना चाहूंगा। समस्या यह है, मैं यह पता नहीं लगा सकता कि ब्राउज़र को फ़ाइल प्राप्त करने का पता कैसे लगाया जाए, इसलिए मैं संकेतक छिपा सकता हूं।
मैं एक छिपे हुए रूप में अनुरोध कर रहा हूं, जो सर्वर पर POST करता है, और इसके परिणामों के लिए एक छिपे हुए iframe को लक्षित करता है। ऐसा इसलिए है क्योंकि मैं परिणाम के साथ संपूर्ण ब्राउज़र विंडो को प्रतिस्थापित नहीं करता। मैं iframe पर एक "लोड" घटना के लिए सुनता हूं, इस उम्मीद में कि डाउनलोड पूरा होने पर यह आग लग जाएगी।
मैं फ़ाइल के साथ "सामग्री-विवाद: अनुलग्नक" शीर्ष लेख लौटाता हूं, जो ब्राउज़र को "सहेजें" संवाद दिखाने का कारण बनता है। लेकिन ब्राउज़र iframe में "लोड" ईवेंट को फायर नहीं करता है।
एक दृष्टिकोण जो मैंने कोशिश की वह एक बहु-भाग प्रतिक्रिया का उपयोग कर रहा है। तो यह एक खाली HTML फ़ाइल, साथ ही संलग्न डाउनलोड करने योग्य फ़ाइल भेजेगा। उदाहरण के लिए:
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
यह फ़ायरफ़ॉक्स में काम करता है; यह खाली HTML फ़ाइल प्राप्त करता है, "लोड" घटना को फायर करता है, फिर डाउनलोड करने योग्य फ़ाइल के लिए "सहेजें" संवाद दिखाता है। लेकिन यह IE और सफारी पर विफल रहता है; IE "लोड" घटना को आग लगाता है, लेकिन फ़ाइल डाउनलोड नहीं करता है, और सफारी फ़ाइल (गलत नाम और सामग्री-प्रकार के साथ) डाउनलोड करता है, और "लोड" घटना को आग नहीं देता है।
फ़ाइल निर्माण शुरू करने के लिए एक कॉल करने के लिए एक अलग दृष्टिकोण हो सकता है, फिर सर्वर को तब तक तैयार करें जब तक यह तैयार न हो, फिर पहले से बनाई गई फ़ाइल डाउनलोड करें। लेकिन मैं सर्वर पर अस्थायी फ़ाइलें बनाने से बचना चाहूंगा।
क्या किसी के पास बेहतर विचार है?