ডেটাআরএল থেকে ব্লব?


92

ব্যবহার FileReader's readAsDataURL()আমি ডেটা URL- এ অবাধ তথ্য রুপান্তর করতে পারেন। Blobবিল্টিন ব্রাউজার এপিআইএস ব্যবহার করে কোনও ডেটা ইউআরএলকে আবার কোনও উদাহরণে রূপান্তর করার উপায় আছে কি ?

উত্তর:


151

ব্যবহারকারী ম্যাট এক বছর আগে নিম্নলিখিত কোডটি প্রস্তাব করেছেন ( কীভাবে জাভাস্ক্রিপ্টে ডাটাআরএল ফাইলের জন্য ডেটাআরএল রূপান্তর করবেন? ) যা আপনাকে সহায়তা করতে পারে

সম্পাদনা: কিছু মন্তব্যকারী হিসাবে রিপোর্ট করা হয়েছে যে ব্লববিল্ডার কিছু সময় আগে অবহেলিত হয়েছে। এটি আপডেট হওয়া কোড:

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
সদৃশ বিভাজনটি কিছুটা অপব্যয়যুক্ত বলে মনে হচ্ছে এটি একটি খুব বড় স্ট্রিং হতে পারে।
জেসি ক্রসন

4
চলক "আইএ" এর ভূমিকা কী - এটি নির্ধারিত একটি মান তবে কখনই ব্লাব গঠনে ব্যবহৃত হয় না। কেন?
আলোকচ্ছটা

4
ব্লেজ, ওয়ার্ড: আইএ বাফারের একটি দৃশ্য । সুতরাং আপনি যখন আইআইএতে প্রতিটি বাইট সেট করবেন, এটি বাফারে লেখা হচ্ছে। Ia লুপ ছাড়াই বাফার সম্পূর্ণ খালি হয়ে যাবে।
মাদুর

4
আমি কীভাবে এই উত্তরটি খুঁজে পাব # 6850276?
বিটি

4
@BT: আমি অনুমান stackoverflow.com/a/30407840/271577 দেয়ার উদ্দেশ্যে করা হচ্ছে (নোট REDIRECTED URL টি "# 6850276" ক্ষেত্রেও প্রযোজ্য)।
ব্রেট জামির

50

@ অ্যাড্রিয়া পদ্ধতির মতো তবে এ্যাপি এপি এবং কেবল ছোট [ ক্যানিয়াস? ]
মাইমটাইপ সম্পর্কে ভাবতে হবে না যেহেতু ব্লব রেসপন্স টাইপটি কেবল বক্সের বাইরে কাজ করে

সতর্কতা: সামগ্রী সুরক্ষা নীতি (সিএসপি) লঙ্ঘন করতে পারে
যদি স্টাফ ব্যবহার করেন তবে করতে পারে

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

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

লিব ব্যবহার না করে আপনি এটির চেয়ে আরও ছোট কিছু করতে পারবেন বলে মনে করবেন না


4
খুবই ভদ্র. দুর্ভাগ্যক্রমে প্রান্ত 13 এবং সাফারি "আনতে" সমর্থন করে না।
alex_1948511

4
এটি প্রান্ত 14 এবং সাফারি 10.1
অন্তহীন

19
অ্যাসিঙ্ক সংস্করণ:const blob = await (await fetch(url)).blob();
খ্রিস্টান ডি'হিউরিউজ

দুর্দান্ত কাজ করে তবে সার্ভার থেকে পড়লে ফাইলটির কোনও এক্সটেনশন থাকে না। কোন চিন্তা?
পাওলজেবা

4
এর বড় সমস্যা fetchহ'ল এটি একটি এসিঙ্ক এপিআই থাকা জোর করে।
ডেনিস সি

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

ইনপুট ডেটা ইউআরআই হ'ল ডেটা ইউআরএল এবং ডেটা টিওয়াইপি ফাইলের ধরণ এবং তারপরে আউটপুট ব্লব অবজেক্ট


4
dataTYPEএমবেড করা হয় dataURIএবং অত: পর প্রথম উত্তর হিসেবে পার্স করা উচিত।
নোয়েল আবরহামস

ডেটা ইউআরএল 2 ব্লবটি আমার প্লাগইন থেকে চিত্র প্রক্রিয়াটির জন্য এসেছে, আপনি এই লিঙ্কটি দেখতে পারেন। আমি কেবল আমার নিজের কোডটি অনুলিপি করছি। github.com/xenophon566/html5.upload/blob/master/js/…
শান উ

12

এক্সএইচআর ভিত্তিক পদ্ধতি।

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

সাফারিতে কাজ করবে না - পৃষ্ঠাটি এইচটিটিপিএস থেকে লোড করা থাকলে এটি ক্রস-অরিজিন ত্রুটি ছুঁড়ে দেবে।
মার্টিন অ্যাডিলা

প্রশ্নটি ডাটাআরএল থেকে ব্লব?
মিশাল


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

এক্সএইচআর এপিআই ব্যবহার করে একটি ব্লব তৈরি করুন :

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

আমার কোডটি রূপান্তর করতে ডেটা ইউআরআই ব্যবহার করুন b এটি অন্যের চেয়ে সহজ এবং পরিষ্কার।

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

আপনি ব্যাখ্যা করতে পারেন কেন আপনার কোডটিতে ইন্টি অ্যারেতে রূপান্তর প্রয়োজন হয় না যখন অন্য সবাই এটি করছে?
আমেন


@ রিকার্ড আপনার অর্থ কি? এটি কোনও চিত্র প্রভাবিত করে না
11

4
এটি কেবলমাত্র কয়েকটি বেসিক স্টাফের জন্য কাজ করে। এটি পড়তে সর্বাধিক সামগ্রী-এনকোডিং সমর্থন করার জন্য আপনাকে প্রথমে এটি + ডিকোডিউরিওকোনমিকটি থেকে পালাতে হবে । এই কারণেই অন্যরা ধীর / ক্ষুধার্ত ডিকোডের ইউআরকি কম্পোনেন্ট / এটব ফাংশন কল এড়াতে স্ট্রিংটিকে ইন্টে অ্যারে রূপান্তর করে এবং সরাসরি বাইটে রূপান্তর করে
এন্ডলেস

0

যেহেতু এই উত্তরগুলির কোনওটিই বেস64 এবং অ বেস-ভিত্তিক ডেটা URL গুলি সমর্থন করে না, ভুমিটম মোছা উত্তরের উপর ভিত্তি করে এমন একটি এখানে দেওয়া হয়েছে:

// 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})
    }
}

দ্রষ্টব্য: আমি নিশ্চিত নই যে সেখানে অন্য ডেটাআরএল মাইম প্রকার রয়েছে যা আলাদাভাবে পরিচালনা করতে হতে পারে। তবে দয়া করে আমাকে জানাবেন! এটি সম্ভব যে ডেটাআরএলগুলি সহজেই তাদের যে কোনও ফর্ম্যাট থাকতে পারে এবং সেক্ষেত্রে আপনার নির্দিষ্ট ব্যবহারের ক্ষেত্রে সঠিক কোডটি খুঁজে বের করা আপনার পক্ষে হবে।


-2

ব্যবহার

FileReader.readAsArrayBuffer(Blob|File)

বরং

FileReader.readAsDataURL(Blob|File)

4
লোকাল স্টোরেজে অনির্দিষ্ট সময়ের জন্য আমাকে এটি ডেটা URL হিসাবে সঞ্চয় করতে হবে, তাই বিকল্প ArrayBufferপথ ব্যবহার করা কার্যকর হবে না।
শেন হলোয়ে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.