DataURL से बूँद?


93

का उपयोग करते हुए FileReader's readAsDataURL()मैं एक डाटा URL में मनमाने ढंग से डेटा बदल सकता है। क्या Blobबिल्ट ब्राउज़र एपिस का उपयोग करके किसी डेटा URL को इंस्टेंस में वापस बदलने का कोई तरीका है ?

जवाबों:


153

उपयोगकर्ता मैट ने एक वर्ष पहले निम्नलिखित कोड का प्रस्ताव दिया है ( जावास्क्रिप्ट में ऑब्जेक्ट को फ़ाइल करने के लिए डेटाURL कैसे परिवर्तित करें? ) जो आपकी मदद कर सकता है ?

EDIT: जैसा कि कुछ टिप्पणीकारों ने बताया है, कुछ समय पहले ब्लबब्यूलर को हटा दिया गया है। यह अपडेटेड कोड है:

function dataURItoBlob(dataURI) {
  // convert base64 to raw binary data held in a string
  // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this
  var byteString = atob(dataURI.split(',')[1]);

  // separate out the mime component
  var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]

  // write the bytes of the string to an ArrayBuffer
  var ab = new ArrayBuffer(byteString.length);

  // create a view into the buffer
  var ia = new Uint8Array(ab);

  // set the bytes of the buffer to the correct values
  for (var i = 0; i < byteString.length; i++) {
      ia[i] = byteString.charCodeAt(i);
  }

  // write the ArrayBuffer to a blob, and you're done
  var blob = new Blob([ab], {type: mimeString});
  return blob;

}

4
डुप्लिकेटेड विभाजन थोड़ा बेकार लगता है, यह देखते हुए कि यह एक बहुत बड़ा स्ट्रिंग हो सकता है।
जेसी क्रॉसेन

2
चर "ia" की भूमिका क्या है - इसका मूल्य निर्धारित किया गया है, लेकिन इसका उपयोग बूँद बनाने में कभी नहीं किया जाता है। क्यों?
ब्लेज़

1
ब्लेज़, वार्ड: आईए बफर का एक दृश्य है। इसलिए जब आप प्रत्येक बाइट को ia में सेट करते हैं, तो यह बफर में लिख रहा है। आईआईए पर लूप के बिना बफर पूरी तरह से खाली हो जाएगा।
Mat

1
मुझे SO उत्तर # 6850276 कैसे मिलेगा?
बीटी

1
@ बीटी: मुझे लगता है कि stackoverflow.com/a/30407840/271577 का इरादा है (ध्यान दें कि पुनर्निर्देशित URL में "# 6850276" शामिल है)।
ब्रेट ज़मीर

54

@ एड्रिया विधि की तरह, लेकिन लेश एपीआई के साथ और सिर्फ छोटा [ कैनिअस? ]
Mimetype के बारे में सोचने की ज़रूरत नहीं है क्योंकि बूँद प्रतिक्रिया प्रकार बस बॉक्स से बाहर काम करता है

चेतावनी:
यदि आप उस सामग्री का उपयोग करते हैं तो सामग्री सुरक्षा नीति (CSP) का उल्लंघन कर सकते हैं

var url = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="

fetch(url)
.then(res => res.blob())
.then(blob => console.log(blob))

लगता है कि आप इसे किसी भी छोटे कर सकते हैं तो यह काम का उपयोग किए बिना


1
बहुत खूबसूरत। दुर्भाग्य से बढ़त 13 और सफारी "लाने" का समर्थन नहीं करता है।
एलेक्स_

2
यह एज 14 और सफारी 10.1
एंडलेस

21
Async संस्करण:const blob = await (await fetch(url)).blob();
क्रिश्चियन d'Heureuse

महान काम करता है, लेकिन सर्वर से पढ़ने पर फ़ाइल का एक्सटेंशन नहीं होता है। कोई विचार?
पौलजेबा

1
इस की बड़ी समस्या यह है fetchकि यह एक async एपीआई होने के लिए मजबूर है।
डेनिस सी

21
dataURItoBlob : function(dataURI, dataTYPE) {
        var binary = atob(dataURI.split(',')[1]), array = [];
        for(var i = 0; i < binary.length; i++) array.push(binary.charCodeAt(i));
        return new Blob([new Uint8Array(array)], {type: dataTYPE});
    }

input dataURI डेटा URL है और dataTYPE फ़ाइल प्रकार और फिर आउटपुट बूँद ऑब्जेक्ट है


1
dataTYPEमें अंतर्निहित है dataURIऔर इसलिए पहले जवाब में के रूप में पार्स किया जाना चाहिए।
नोएल अब्राहम

dataURL2Blob इमेज प्रोसेस के लिए मेरे प्लगइन से आया है, आप इस लिंक को देख सकते हैं। मैं सिर्फ अपना कोड कॉपी करता हूं। github.com/xenophon566/html5.upload/blob/master/js/…
शॉन वू

12

XHR आधारित पद्धति।

function dataURLtoBlob( dataUrl, callback )
{
    var req = new XMLHttpRequest;

    req.open( 'GET', dataUrl );
    req.responseType = 'arraybuffer'; // Can't use blob directly because of https://crbug.com/412752

    req.onload = function fileLoaded(e)
    {
        // If you require the blob to have correct mime type
        var mime = this.getResponseHeader('content-type');

        callback( new Blob([this.response], {type:mime}) );
    };

    req.send();
}

dataURLtoBlob( 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==', function( blob )
{
    console.log( blob );
});

लगता है, यह अब सबसे अच्छा तरीका है। धन्यवाद!
dizel3d

सफ़ारी में काम नहीं करेगा - अगर HTTPS से पेज लोड किया जाता है तो यह क्रॉस-ऑरिजनल एरर फेंक देगा।
मार्टिन .दिला

प्रश्न DatabL से बूँद है?
मचल


3

प्रयत्न:

function dataURItoBlob(dataURI) {
    if(typeof dataURI !== 'string'){
        throw new Error('Invalid argument: dataURI must be a string');
    }
    dataURI = dataURI.split(',');
    var type = dataURI[0].split(':')[1].split(';')[0],
        byteString = atob(dataURI[1]),
        byteStringLength = byteString.length,
        arrayBuffer = new ArrayBuffer(byteStringLength),
        intArray = new Uint8Array(arrayBuffer);
    for (var i = 0; i < byteStringLength; i++) {
        intArray[i] = byteString.charCodeAt(i);
    }
    return new Blob([intArray], {
        type: type
    });
}

2

XHR API का उपयोग करके एक बूँद बनाएँ :

function dataURLtoBlob( dataUrl, callback )
{
    var req = new XMLHttpRequest;

    req.open( 'GET', dataUrl );
    req.responseType = 'blob';

    req.onload = function fileLoaded(e)
    {
        callback(this.response);
    };

    req.send();
}

var dataURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='

dataURLtoBlob(dataURI , function( blob )
{
    console.log( blob );
});


0

मेरे कोड का उपयोग करें dataURI को ब्लॉब में बदलें। यह दूसरों की तुलना में सरल और साफ है।

function dataURItoBlob(dataURI) {
    var arr = dataURI.split(','), mime = arr[0].match(/:(.*?);/)[1];
    return new Blob([atob(arr[1])], {type:mime});
}

क्या आप बता सकते हैं कि आपके कोड को int सरणी में रूपांतरण की आवश्यकता क्यों नहीं है जबकि बाकी सभी ऐसा कर रहे हैं?
अमीन


@ रिकर्ड का क्या मतलब है? यह किसी भी छवि को प्रभावित नहीं करता है
cuixiping

2
यह केवल कुछ बुनियादी सामान के लिए काम करता है। इसे पढ़ने के लिए सबसे अधिक सामग्री-एन्कोडिंग का समर्थन करने के लिए आपको सबसे पहले बचना होगा + decodeURIComponent । इसीलिए अन्य लोग धीमे / भूखे डिकोडायरेम्पोनेंट / एटोब फ़ंक्शन कॉल से बचने के लिए एक स्ट्रिंग को इंट सरणी में परिवर्तित करते हैं और सीधे बाइट्स में परिवर्तित करते हैं
अंतहीन

0

चूँकि इनमें से कोई भी उत्तर आधार 64 और गैर-आधार64 डेटाअरल का समर्थन नहीं करता है, यहाँ एक है जो vuamitom के हटाए गए उत्तर पर आधारित है:

// from /programming/37135417/download-canvas-as-png-in-fabric-js-giving-network-error/
var dataURLtoBlob = exports.dataURLtoBlob = function(dataurl) {
    var parts = dataurl.split(','), mime = parts[0].match(/:(.*?);/)[1]
    if(parts[0].indexOf('base64') !== -1) {
        var bstr = atob(parts[1]), n = bstr.length, u8arr = new Uint8Array(n)
        while(n--){
            u8arr[n] = bstr.charCodeAt(n)
        }

        return new Blob([u8arr], {type:mime})
    } else {
        var raw = decodeURIComponent(parts[1])
        return new Blob([raw], {type: mime})
    }
}

ध्यान दें: मुझे यकीन नहीं है कि अगर अन्य dataURL माइम प्रकार हैं जिन्हें अलग तरीके से संभाला जा सकता है। लेकिन कृपया मुझे बताएं कि क्या आपको पता है! यह संभव है कि डेटायूएल के पास कोई भी प्रारूप हो जो वे चाहते हैं, और उस स्थिति में यह आपके विशेष उपयोग के मामले के लिए सही कोड खोजने के लिए आपके ऊपर होगा।


-2

उपयोग

FileReader.readAsArrayBuffer(Blob|File)

बजाय

FileReader.readAsDataURL(Blob|File)

2
मुझे इसे लोकलस्टोरेज में अनिश्चित काल के लिए डेटाुरल के रूप में स्टोर करना है, इसलिए वैकल्पिक ArrayBufferपथ का उपयोग करने से काम नहीं चलेगा।
शेन होलोवे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.