ব্রাউজার / এইচটিএমএল ফোনের চিত্রটি এসসিআর = "ডেটা: চিত্র / জেপিগ; বেস 64 ..." থেকে ডাউনলোড করুন


86

আমি ক্লায়েন্টের পাশে একটি চিত্র উত্পন্ন করছি এবং আমি এটি এইচটিএমএল এর সাথে প্রদর্শন করি:

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

উত্পন্ন চিত্রটি ডাউনলোড করার সম্ভাবনাটি আমি দিতে চাই।

আমি কীভাবে বুঝতে পারি যে ব্রাউজারটি একটি ফাইল সেভ ডায়লজ খুলছে (বা কেবল ক্রোম বা ফায়ারফক্সের মতো চিত্রটি ডাউনলোড ফোল্ডারে ডাউনলোড করবে) যা ব্যবহারকারীকে ডান ক্লিক না করে চিত্রটি সংরক্ষণ করতে এবং চিত্রটিতে যেমন সংরক্ষণ করতে দেয়?

আমি সার্ভারের মিথস্ক্রিয়া ছাড়াই কোনও সমাধান পছন্দ করব। সুতরাং আমি সচেতন যে আমি যদি প্রথম চিত্রটি আপলোড করি এবং তারপরে ডাউনলোড শুরু করি তবে এটি সম্ভব হবে।

অনেক ধন্যবাদ!

উত্তর:


120

কেবল 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:ইউআরআই ব্যবহার করা :

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!
};

প্রাসঙ্গিক ডকুমেন্টেশন


4
কোনও কারণে এটি ক্রোম 19.0 বিটাতে ভাঙ্গা হওয়া সিল করে তবে এটি ক্রোম 18 এবং ফায়ারফক্সে কাজ করে তাই আমি ভাল আছি। কোনও ফাইলের নাম সেট করার কোনও সম্ভাবনা আছে?
অ্যালেক্স

কোনও ডাটা-ইউআরআইতে ফাইলের নাম সেট করার কোনও উপায় নেই। এমনকি যখন কোনও ক্যানভাস / ব্লব ডেটা রফতানি করতে ব্যবহৃত হয় তখনও ফাইলটির নাম সেট করা যায় না। আমি আমার উত্তরে অন্য একটি পদ্ধতি যুক্ত করেছি (আমার ধারণা এই যে এটি ক্রোম ১৯-এ কাজ করবে)।
রব ডাব্লু

4
আপনি কি মনে করেন যে প্রথম পদ্ধতিটি ক্রোম 19-এ আর কাজ করছে না বলে অবহিত হতে চলেছে?
অ্যালেক্স

4
আমি এটিতে কোনও প্রাসঙ্গিক উত্স খুঁজে পাই না। আমি এই উত্তরটিও খুঁজে পেয়েছি , যাইহোক, যা ক্রোমে কোনও ডিফল্ট নাম সেট করতে হয় তার পরামর্শ দেয় (কেবলমাত্র অ্যাঙ্করগুলি, ব্যবহারকারীকে এটিতে ক্লিক করতে হবে)
রব ডব্লু

এছাড়াও এই সমাধানগুলি খুঁজে পেয়েছে - কেবল আপাতত ক্রোম বলে মনে হচ্ছে। তোমার সহযোগিতার জন্যে ধন্যবাদ!
অ্যালেক্স

98

আপনি একটি ট্যাগে ডাউনলোড বৈশিষ্ট্যটি ব্যবহার করতে পারেন ...

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

আরো দেখুন: https://developer.mozilla.org/en/HTML/element/a#attr-download


4
আমি যখন গতিশীল চিত্রের উত্স উত্পন্ন করি তখন কীভাবে আমি এই সমাধানটি ব্যবহার করতে পারি? মানে আমার কাছে ডাউনলোড বোতাম আছে, যখন ব্যবহারকারী এটিতে ক্লিক করে, আমি কিছু গণনা করি, বেস 64 চিত্র উত্পন্ন করি এবং ... আমি কীভাবে ডাউনলোডকে বাধ্য করতে পারি?
মিখাইল

ক্রোমে আমি এই পদ্ধতিটি ব্যবহার করে ফাইলের নাম সেট করতে পারি না। ডাউনলোড করা ফাইলটির নাম যাই হোক না কেন "ডাউনলোড" থেকে যায়। এটি কেবলমাত্র ডেটা ব্যবহার করার সময় ঘটে: চিত্র ...
cmaduro

4
আমি জানি এই একটি পুরানো পোস্ট কিন্তু W3Schools অনুযায়ী ওয়েবসাইট 'ডাউনলোড' অ্যাট্রিবিউট ইন্টারনেট, সাফারি এবং অপেরা বনাম দ্বারা সমর্থিত নয়। <12 w3schools.com/tags/tryit.asp?filename=tryhtml5_a_download2 আসলে আমি আই ই এবং এটা চেষ্টা এটি কাজ করে না .... :(
মিরকো লুগানো

6
এই মন্তব্যের সময়, downloadবৈশিষ্ট্যটি এখনও সাফারি এবং আইই সমর্থন করে না।
TheCarver

4
এর বেস64 দৈর্ঘ্যের সীমাবদ্ধতা রয়েছে আপনি এই অ্যাপ্রোচটি ব্যবহার করে বৃহত্তর চিত্রগুলি ডাউনলোড করতে পারবেন না।
কিরণ চেন্না

15

আমি একটি চিত্র ট্যাগ একটি সন্তান হিসাবে প্রয়োজন হয় একটি ট্যাগ, নিম্নলিখিত পদ্ধতিতে:

<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);

এটি এমন নয় যে এর ভিতরে একটি আইএমবি ট্যাগের প্রয়োজন, এমএসডিএন ডক্স জানিয়েছে যে কেবল ইতিমধ্যে ডাউনলোড করা সংস্থানগুলি ব্যবহার করা যেতে পারে - যতক্ষণ না আপনার কাছে একই ডেটাযুক্ত চিত্র থাকতে পারে: বেস 64 যেখানেই থাকুক। msdn.mic Microsoft.com/en-us/library/cc848897.aspx - "সুরক্ষার কারণে ডেটা ইউআরআই ডাউনলোড করা সংস্থানগুলিতে সীমাবদ্ধ Data
দিমিতর ক্রিস্টফ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.