मेरे पास एक jquery- आधारित सिंगल-पेज वेबप है। यह AJAX कॉल के माध्यम से एक RESTful वेब सेवा के साथ संचार करता है।
मैं निम्नलिखित को पूरा करने की कोशिश कर रहा हूं:
- एक POST जमा करें जिसमें JSON डेटा एक REST url में हो।
- यदि अनुरोध JSON प्रतिक्रिया निर्दिष्ट करता है, तो JSON वापस आ जाता है।
- यदि अनुरोध एक पीडीएफ / एक्सएलएस / आदि प्रतिक्रिया निर्दिष्ट करता है, तो एक डाउनलोड करने योग्य बाइनरी वापस आ जाती है।
मेरे पास अभी 1 & 2 काम कर रहे हैं, और क्लाइंट jquery ऐप वेब पेज में दिए गए डेटा को JSON डेटा के आधार पर DOM तत्व बनाकर प्रदर्शित करता है। मेरे पास वेब-सेवा की दृष्टि से # 3 काम है, जिसका अर्थ है कि अगर JSON पैरामीटर दिए गए हैं तो यह एक बाइनरी फ़ाइल बनाएगा और लौटाएगा। लेकिन मैं क्लाइंट जावास्क्रिप्ट कोड में # 3 से निपटने का सबसे अच्छा तरीका अनिश्चित हूं।
क्या इस तरह से अजाक्स कॉल से एक डाउनलोड करने योग्य फ़ाइल वापस प्राप्त करना संभव है? मुझे फ़ाइल डाउनलोड करने और सहेजने के लिए ब्राउज़र कैसे मिलेगा?
$.ajax({
type: "POST",
url: "/services/test",
contentType: "application/json",
data: JSON.stringify({category: 42, sort: 3, type: "pdf"}),
dataType: "json",
success: function(json, status){
if (status != "success") {
log("Error loading data");
return;
}
log("Data loaded!");
},
error: function(result, status, err) {
log("Error loading data");
return;
}
});
सर्वर निम्नलिखित हेडर के साथ प्रतिक्रिया करता है:
Content-Disposition:attachment; filename=export-1282022272283.pdf
Content-Length:5120
Content-Type:application/pdf
Server:Jetty(6.1.11)
एक अन्य विचार यह है कि पीडीएफ को जेनरेट किया जाए और इसे सर्वर पर स्टोर किया जाए और JSON को लौटाया जाए जिसमें फ़ाइल का URL शामिल है। फिर, अजाक्स सफलता हैंडलर में एक और कॉल जारी करने के लिए निम्न जैसा कुछ करें:
success: function(json,status) {
window.location.href = json.url;
}
लेकिन इसका मतलब है कि मुझे सर्वर पर एक से अधिक कॉल करने की आवश्यकता होगी, और मेरे सर्वर को डाउनलोड करने योग्य फ़ाइलों का निर्माण करने, उन्हें कहीं स्टोर करने की आवश्यकता होगी, फिर समय-समय पर उस भंडारण क्षेत्र को साफ करना होगा।
इसे पूरा करने का एक सरल तरीका होना चाहिए। विचार?
संपादित करें: $ .ajax के लिए डॉक्स की समीक्षा करने के बाद, मैं देखता हूं कि प्रतिक्रिया डेटाटाइप केवल एक में से एक हो सकता है xml, html, script, json, jsonp, text
, इसलिए मैं अनुमान लगा रहा हूं कि जब तक मैं द्विआधारी फ़ाइल का उपयोग नहीं करता, तब तक किसी ऐजैक्स अनुरोध का उपयोग करके सीधे फ़ाइल डाउनलोड करने का कोई तरीका नहीं है। डेटा यूआरआई योजना जैसा कि @VinayC उत्तर में सुझाव दिया गया है (जो कुछ ऐसा नहीं है जो मैं करना चाहता हूं)।
इसलिए मुझे लगता है कि मेरे विकल्प हैं:
Ajax का उपयोग न करें और इसके बजाय एक फॉर्म पोस्ट सबमिट करें और मेरे JSON डेटा को फॉर्म वैल्यू में एम्बेड करें। शायद छिपे हुए iframes और इस तरह के साथ गड़बड़ करने की आवश्यकता होगी।
अजाक्स का उपयोग न करें और इसके बजाय एक मानक GET अनुरोध बनाने और इस URL के लिए window.location.href सेट करने के लिए मेरे JSON डेटा को क्वेरी स्ट्रिंग में परिवर्तित करें। ब्राउज़र को एप्लिकेशन URL से बदलने से रोकने के लिए मेरे क्लिक हैंडलर में event.preventDefault () का उपयोग करने की आवश्यकता हो सकती है।
ऊपर मेरे अन्य विचार का उपयोग करें, लेकिन @naikus उत्तर से सुझावों के साथ बढ़ाया। AJAX अनुरोध को कुछ पैरामीटर के साथ सबमिट करें जो वेब-सेवा को यह बताता है कि इसे अजाक्स कॉल के माध्यम से बुलाया जा रहा है। यदि वेब सेवा को अजाक्स कॉल से कॉल किया जाता है, तो जेनसन को जनरेट किए गए संसाधन के साथ URL पर लौटाएं। यदि संसाधन को सीधे कहा जाता है, तो वास्तविक बाइनरी फ़ाइल लौटाएं।
जितना मैं इसके बारे में सोचता हूं, उतना ही मुझे आखिरी विकल्प पसंद आता है। इस तरह से मैं अनुरोध के बारे में जानकारी प्राप्त कर सकता हूं (उत्पन्न करने का समय, फ़ाइल का आकार, त्रुटि संदेश आदि) और मैं डाउनलोड शुरू करने से पहले उस जानकारी पर कार्य कर सकता हूं। नकारात्मक पक्ष सर्वर पर अतिरिक्त फ़ाइल प्रबंधन है।
इसे पूरा करने का कोई और तरीका? इन विधियों के बारे में कोई भी नियम / सहमति जो मुझे पता होनी चाहिए?
url = 'http://localhost/file.php?file='+ $('input').val(); window.open(url);
समान परिणाम प्राप्त करने का आसान तरीका। हैडर को php फाइल में रखें। कोई भी अजाक्स भेजने या अनुरोध प्राप्त करने की आवश्यकता नहीं है