दुर्भाग्य @ BrianFreud का जवाब मेरी जरूरतों फिट नहीं करता है, मैं एक छोटे से अलग की जरूरत थी , और मुझे पता है कि @ ब्रायनफ्रुड के सवाल का जवाब नहीं है, लेकिन मैं इसे यहां छोड़ रहा हूं क्योंकि बहुत से लोग मेरी ज़रूरत के साथ यहां पहुंचे हैं। मुझे 'यूआरएल से फाइल या ब्लॉब कैसे प्राप्त करें' जैसी कुछ चाहिए? और वर्तमान सही उत्तर मेरी ज़रूरतों को पूरा नहीं करता है क्योंकि यह क्रॉस-डोमेन नहीं है।
मैं एक वेबसाइट है कि एक अमेज़न S3/Azure संग्रहण से छवियों की खपत है, और मैं uniqueidentifiers साथ नामित वस्तुओं की दुकान:
नमूना: http: //****.blob.core.windows। नेट/systemimages/bf142dc9-0185-4aee-a3f4-1e5e95a09bcf
इनमें से कुछ छवियों को हमारे सिस्टम इंटरफ़ेस से डाउनलोड किया जाना चाहिए। मेरे HTTP सर्वर के माध्यम से इस ट्रैफ़िक को पार करने से बचने के लिए, चूंकि इस ऑब्जेक्ट को किसी भी सुरक्षा को एक्सेस करने की आवश्यकता नहीं है (डोमेन फ़िल्टरिंग को छोड़कर), मैंने उपयोगकर्ता के ब्राउज़र पर सीधा अनुरोध करने का निर्णय लिया और फ़ाइल को वास्तविक नाम देने के लिए स्थानीय प्रसंस्करण का उपयोग किया और विस्तार।
पूरा करने के लिए है कि मैं हेनरी Algus से इस महान लेख का इस्तेमाल किया है: http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/
1. सबसे पहले कदम: jQuery के लिए द्विआधारी समर्थन जोड़ें
/**
*
* jquery.binarytransport.js
*
* @description. jQuery ajax transport for making binary data type requests.
* @version 1.0
* @author Henry Algus <[email protected]>
*
*/
// use this transport for "binary" data type
$.ajaxTransport("+binary", function (options, originalOptions, jqXHR) {
// check for conditions and support for blob/arraybuffer response type
if (window.FormData && ((options.dataType && (options.dataType == 'binary')) || (options.data && ((window.ArrayBuffer && options.data instanceof ArrayBuffer) || (window.Blob && options.data instanceof Blob))))) {
return {
// create new XMLHttpRequest
send: function (headers, callback) {
// setup all variables
var xhr = new XMLHttpRequest(),
url = options.url,
type = options.type,
async = options.async || true,
// blob or arraybuffer. Default is blob
dataType = options.responseType || "blob",
data = options.data || null,
username = options.username || null,
password = options.password || null;
xhr.addEventListener('load', function() {
var data = {};
data[options.dataType] = xhr.response;
// make callback and send data
callback(xhr.status, xhr.statusText, data, xhr.getAllResponseHeaders());
});
xhr.open(type, url, async, username, password);
// setup custom headers
for (var i in headers) {
xhr.setRequestHeader(i, headers[i]);
}
xhr.responseType = dataType;
xhr.send(data);
},
abort: function() {
jqXHR.abort();
}
};
}
});
2. दूसरा चरण: एक बनाओ इस परिवहन प्रकार का उपयोग करने का अनुरोध करें।
function downloadArt(url)
{
$.ajax(url, {
dataType: "binary",
processData: false
}).done(function (data) {
// just my logic to name/create files
var filename = url.substr(url.lastIndexOf('/') + 1) + '.png';
var blob = new Blob([data], { type: 'image/png' });
saveAs(blob, filename);
});
}
अब आपके द्वारा बनाए ब्लॉब का उपयोग के रूप में आप, मेरे मामले में मैं चाहता हूँ यह डिस्क के लिए बचाने के लिए करना चाहते हैं कर सकते हैं।
3. वैकल्पिक: उपयोगकर्ता के कंप्यूटर FileSaver
मैं FileSaver का इस्तेमाल किया है के प्रयोग पर फ़ाइल सहेजें।js डिस्क पर डाउनलोड की गई फ़ाइल को बचाने के लिए, अगर आपको लगता है कि पूरा करने की आवश्यकता है, इस जावास्क्रिप्ट पुस्तकालय का उपयोग करें:
https://github.com/eligrey/FileSaver.js/
मैं इस अधिक विशिष्ट जरूरतों के साथ दूसरों की मदद करने की उम्मीद है।
पिछले दो टिप्पणियों के बारे में कभी भी नहीं - आपको केवल ब्लॉब यूआरएल में 'XMLHttpRequest' भेजना है। – gengkev
क्या एक शानदार सवाल है! –
क्यों न केवल मूल फ़ाइल ऑब्जेक्ट्स को कहीं भी संग्रहीत करें, फिर उन्हें प्रदर्शित करने के लिए ऑब्जेक्ट यूआरएल का उपयोग करें और फॉर्म पर मूल फाइलों का उपयोग सबमिट करें? – user764754