ब्राउज़र / HTML फोर्स src से छवि डाउनलोड करें = "डेटा: छवि / जेपीईजी; बेस 64 ..."


85

मैं क्लाइंट की तरफ एक छवि उत्पन्न कर रहा हूं और मैं इसे इस तरह से HTML के साथ प्रदर्शित करता हूं:

<img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgM...."/>

मैं उत्पन्न छवि को डाउनलोड करने की संभावना प्रदान करना चाहता हूं।

मुझे कैसे महसूस हो सकता है कि ब्राउज़र एक फ़ाइल सेव डायलॉग (या सिर्फ क्रोम डाउनलोड करने के लिए क्रोम या फ़ायरफ़ॉक्स की तरह छवि डाउनलोड करेगा) जो उपयोगकर्ता को राइट क्लिक किए बिना छवि को बचाने और छवि पर सहेजने की अनुमति देता है ?

मैं सर्वर बातचीत के बिना एक समाधान पसंद करेंगे। इसलिए मुझे पता है कि यह संभव होगा अगर मैं पहली बार छवि अपलोड करता हूं और फिर डाउनलोड शुरू करता हूं।

आपका बहुत बहुत धन्यवाद!

जवाबों:


119

बस के image/jpegसाथ बदलें application/octet-stream। क्लाइंट URL को इनलाइन-सक्षम संसाधन के रूप में नहीं पहचानता, और डाउनलोड संवाद को संकेत देता है।

एक सरल जावास्क्रिप्ट समाधान होगा:

//var img = reference to image
var url = img.src.replace(/^data:image\/[^;]+/, 'data:application/octet-stream');
window.open(url);
// Or perhaps: location.href = url;
// Or even setting the location of an <iframe> element, 

एक अन्य विधि एक blob:URI का उपयोग करना है :

var img = document.images[0];
img.onclick = function() {
    // atob to base64_decode the data-URI
    var image_data = atob(img.src.split(',')[1]);
    // Use typed arrays to convert the binary data to a Blob
    var arraybuffer = new ArrayBuffer(image_data.length);
    var view = new Uint8Array(arraybuffer);
    for (var i=0; i<image_data.length; i++) {
        view[i] = image_data.charCodeAt(i) & 0xff;
    }
    try {
        // This is the recommended method:
        var blob = new Blob([arraybuffer], {type: 'application/octet-stream'});
    } catch (e) {
        // The BlobBuilder API has been deprecated in favour of Blob, but older
        // browsers don't know about the Blob constructor
        // IE10 also supports BlobBuilder, but since the `Blob` constructor
        //  also works, there's no need to add `MSBlobBuilder`.
        var bb = new (window.WebKitBlobBuilder || window.MozBlobBuilder);
        bb.append(arraybuffer);
        var blob = bb.getBlob('application/octet-stream'); // <-- Here's the Blob
    }

    // Use the URL object to create a temporary URL
    var url = (window.webkitURL || window.URL).createObjectURL(blob);
    location.href = url; // <-- Download!
};

प्रासंगिक प्रलेखन


1
किसी कारण से यह क्रोम 19.0 बीटा में टूट गया, लेकिन यह क्रोम 18 और फ़ायरफ़ॉक्स पर काम करता है इसलिए मैं ठीक हूं। क्या कोई फ़ाइल नाम सेट करने की संभावना है?
एलेक्स

डेटा-यूआरआई में फ़ाइल नाम सेट करने का कोई तरीका नहीं है। यहां तक ​​कि जब डेटा को निर्यात करने के लिए एक कैनवास / ब्लॉब का उपयोग किया जाता है, तो फ़ाइल नाम सेट नहीं किया जा सकता है। मैंने अपने उत्तर में एक और तरीका जोड़ा है (मुझे लगता है कि यह Chrome 19 में काम करेगा)।
रॉब डब्ल्यू

2
क्या आपको लगता है कि क्रोम 19 में काम नहीं कर रहा है, क्योंकि पहली विधि को हटा दिया जा रहा है?
एलेक्स

1
मुझे इस पर एक प्रासंगिक स्रोत नहीं मिल रहा है। मुझे यह उत्तर भी मिला है, वैसे, जो यह बताता है कि क्रोम में डिफ़ॉल्ट नाम कैसे सेट किया जाए (केवल एंकर, उपयोगकर्ता को इस पर क्लिक करना होगा)
रोब डब्ल्यू

यह भी समाधान पाया - लगता है कि क्रोम के लिए केवल अब। आपके समर्थन के लिए धन्यवाद!
एलेक्स

97

आप टैग पर डाउनलोड विशेषता का उपयोग कर सकते हैं ...

<a href="data:image/jpeg;base64,/9j/4AAQSkZ..." download="filename.jpg"></a>

और देखें: https://developer.mozilla.org/en/HTML/element/a#attr-download


1
जब मैं छवि स्रोत को गतिशील रूप से उत्पन्न करता हूं तो मैं इस समाधान का उपयोग कैसे कर सकता हूं? मेरा मतलब है कि मेरे पास डाउनलोड बटन है, जब उपयोगकर्ता उस पर क्लिक करता है, तो मैं कुछ गणना करता हूं, आधार 64 छवि उत्पन्न करता हूं और ... मैं कैसे डाउनलोड करने के लिए मजबूर कर सकता हूं?
मिखाइल

क्रोम में मैं इस विधि का उपयोग करके फ़ाइल नाम सेट नहीं कर सकता। डाउनलोड की गई फ़ाइल का नाम "डाउनलोड" रहता है, इससे कोई फर्क नहीं पड़ता। यह केवल डेटा का उपयोग करते समय ही होता है: छवि ...
cmaduro

5
मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन W3Schools वेबसाइट के अनुसार 'डाउनलोड' विशेषता IE, सफारी और ओपेरा v द्वारा समर्थित नहीं है। <12 w3schools.com/tags/tryit.asp?filename=tryhtml_a_download2 वास्तव में मैंने इसे IE के साथ आज़माया था। यह काम नहीं करता है ... :(
मिर्को लुगानो

6
इस टिप्पणी के समय, downloadविशेषता अभी भी सफारी और IE समर्थित नहीं है।
कार्वर

1
इसकी बेस64 लंबाई सीमा है आप इस एप्रोच का उपयोग करके बड़ी छवियां डाउनलोड नहीं कर सकते।
किरण चेनना

15

मुझे लगता है कि एक img टैग एक के एक बच्चे के रूप में की जरूरत है एक टैग, निम्नलिखित तरीके:

<a download="YourFileName.jpeg" href="data:image/jpeg;base64,iVBO...CYII=">
    <img src="data:image/jpeg;base64,iVBO...CYII="></img>
</a>

या

<a download="YourFileName.jpeg" href="/path/to/OtherFile.jpg">
    <img src="/path/to/OtherFile.jpg"></img>
</a>

केवल का उपयोग कर एक टैग # 15 में बताई गई विधि फ़ायरफ़ॉक्स और क्रोम के नवीनतम संस्करण के साथ मेरे लिए काम नहीं किया था, लेकिन दोनों में एक ही छवि डेटा डाल a.href और img.src टैग मेरे लिए काम किया।

जावास्क्रिप्ट से इसे इस तरह उत्पन्न किया जा सकता है:

var data = canvas.toDataURL("image/jpeg");

var img = document.createElement('img');
img.src = data;

var a = document.createElement('a');
a.setAttribute("download", "YourFileName.jpeg");
a.setAttribute("href", data);
a.appendChild(img);

var w = open();
w.document.title = 'Export Image';
w.document.body.innerHTML = 'Left-click on the image to save it.';
w.document.body.appendChild(a);

ऐसा नहीं है कि इसे अंदर एक img टैग की आवश्यकता है, MSDN डॉक्स राज्य जो केवल पहले से डाउनलोड किए गए संसाधनों का उपयोग कर सकता है - जब तक आपके पास एक ही डेटा के साथ छवि है तब तक काम करना चाहिए: बेस 64 कहीं भी। msdn.microsoft.com/en-us/library/cc848897.aspx - "सुरक्षा कारणों से, डेटा URI को डाउनलोड किए गए संसाधनों तक सीमित रखा गया है। डेटा URI का उपयोग नेविगेशन के लिए, स्क्रिप्टिंग के लिए, या फ़्रेम या आइफ्रेम तत्वों को पॉप्युलेट करने के लिए नहीं किया जा सकता है।"
दिमित्र क्रिस्टोफ़

5

FileSaver.js पर एक नज़र डालें । यह एक आसान saveAsकार्य प्रदान करता है जो अधिकांश ब्राउज़र विशिष्ट quirks का ख्याल रखता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.