फ़ाइलें डाउनलोड करना (Axios और सुरक्षा का उपयोग करके)
यह वास्तव में और भी जटिल है जब आप Axios और सुरक्षा के कुछ साधनों का उपयोग करके फ़ाइलों को डाउनलोड करना चाहते हैं। किसी अन्य व्यक्ति को यह पता लगाने में बहुत अधिक समय खर्च करने से रोकने के लिए, मुझे इसके माध्यम से चलना चाहिए।
आपको 3 चीजें करने की आवश्यकता है:
1. Configure your server to permit the browser to see required HTTP headers
2. Implement the server-side service, and making it advertise the correct file type for the downloaded file.
3. Implementing an Axios handler to trigger a FileDownload dialog within the browser
ये चरण ज्यादातर उल्लेखनीय हैं - लेकिन कॉर्स के ब्राउज़र के संबंध से काफी जटिल हैं। एक समय में एक ही कदम:
1. अपने (HTTP) सर्वर को कॉन्फ़िगर करें
परिवहन सुरक्षा को नियोजित करते समय, जावास्क्रिप्ट एक ब्राउज़र के भीतर निष्पादित कर सकता है [डिज़ाइन द्वारा] HTTP हेडर के केवल 6 का उपयोग वास्तव में HTTP सर्वर द्वारा भेजा गया है। यदि हम सर्वर को डाउनलोड के लिए फ़ाइल नाम सुझाना चाहते हैं, तो हमें ब्राउज़र को सूचित करना होगा कि जावास्क्रिप्ट के लिए "ओके" अन्य हेडर तक पहुँच दी जाए, जहाँ सुझाया गया फ़ाइल नाम पहुँचाया जाएगा।
आइए हम चर्चा करें - चर्चा के लिए - कि हम चाहते हैं कि सर्वर सुझाए गए फ़ाइलनाम को एक HTTP हेडर के भीतर एक्स-सुझाव-फाइलन नाम से प्रसारित करे । HTTP सर्वर ब्राउज़र को बताता है कि इस प्राप्त कस्टम हेडर को जावास्क्रिप्ट / एक्सियोस के साथ निम्नलिखित हेडर के साथ उजागर करना ठीक है:
Access-Control-Expose-Headers: X-Suggested-Filename
इस शीर्ष लेख को सेट करने के लिए अपने HTTP सर्वर को कॉन्फ़िगर करने का सटीक तरीका उत्पाद से उत्पाद में भिन्न होता है।
इन मानक शीर्ष लेखों की पूरी व्याख्या और विस्तृत विवरण के लिए https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers देखें ।
2. सर्वर-साइड सेवा को लागू करें
आपके सर्वर-साइड सेवा कार्यान्वयन को अब 2 चीजें करनी चाहिए:
1. Create the (binary) document and assign correct ContentType to the response
2. Assign the custom header (X-Suggested-Filename) containing the suggested file name for the client
यह आपके चुने हुए प्रौद्योगिकी स्टैक के आधार पर विभिन्न तरीकों से किया जाता है। मैं JavaEE 7 मानक का उपयोग करके एक उदाहरण को स्केच करूँगा जो एक एक्सेल रिपोर्ट का उत्सर्जन करना चाहिए:
@GET
@Path("/report/excel")
@Produces("application/vnd.ms-excel")
public Response getAllergyAndPreferencesReport() {
// Create the document which should be downloaded
final byte[] theDocumentData = ....
// Define a suggested filename
final String filename = ...
// Create the JAXRS response
// Don't forget to include the filename in 2 HTTP headers:
//
// a) The standard 'Content-Disposition' one, and
// b) The custom 'X-Suggested-Filename'
//
final Response.ResponseBuilder builder = Response.ok(
theDocumentData, "application/vnd.ms-excel")
.header("X-Suggested-Filename", fileName);
builder.header("Content-Disposition", "attachment; filename=" + fileName);
// All Done.
return builder.build();
}
सेवा अब द्विआधारी दस्तावेज़ (एक एक्सेल रिपोर्ट, इस मामले में) का उत्सर्जन करती है, सही सामग्री प्रकार सेट करती है - और दस्तावेज़ को सहेजते समय उपयोग करने के लिए सुझाए गए फ़ाइलनाम वाले कस्टम HTTP हेडर भी भेजता है।
3. प्राप्त दस्तावेज के लिए एक Axios हैंडलर लागू करें
यहाँ कुछ नुकसान हैं, तो चलिए सुनिश्चित करते हैं कि सभी विवरण सही ढंग से कॉन्फ़िगर किए गए हैं:
- सेवा @GET (HTTP HTTP GET) पर प्रतिक्रिया देती है, इसलिए अक्षीय कॉल 'axios.get (...)' होनी चाहिए।
- दस्तावेज़ को बाइट्स की एक धारा के रूप में प्रेषित किया जाता है, इसलिए आपको प्रतिक्रिया को एचटीएमएल 5 ब्लॉब के रूप में व्यवहार करने के लिए axios को बताना होगा। (यानी प्रतिक्रियाप्रकार: 'बूँद' )।
- इस स्थिति में, फ़ाइल-सेवर जावास्क्रिप्ट लाइब्रेरी का उपयोग ब्राउज़र संवाद को खोलने के लिए किया जाता है। हालाँकि, आप दूसरा चुन सकते हैं।
कंकाल कुल्हाड़ी कार्यान्वयन तब की तर्ज पर कुछ होगा:
// Fetch the dynamically generated excel document from the server.
axios.get(resource, {responseType: 'blob'}).then((response) => {
// Log somewhat to show that the browser actually exposes the custom HTTP header
const fileNameHeader = "x-suggested-filename";
const suggestedFileName = response.headers[fileNameHeader];'
const effectiveFileName = (suggestedFileName === undefined
? "allergierOchPreferenser.xls"
: suggestedFileName);
console.log("Received header [" + fileNameHeader + "]: " + suggestedFileName
+ ", effective fileName: " + effectiveFileName);
// Let the user save the file.
FileSaver.saveAs(response.data, effectiveFileName);
}).catch((response) => {
console.error("Could not Download the Excel report from the backend.", response);
});