জাভাস্ক্রিপ্টে একটি বেস 64 স্ট্রিং থেকে একটি বিএলএলবি তৈরি করা


447

আমার কাছে স্ট্রিংটিতে বেস 64-এনকোডেড বাইনারি ডেটা রয়েছে:

const contentType = 'image/png';
const b64Data = 'iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==';

আমি এই ডেটাযুক্ত একটি blob:ইউআরএল তৈরি করতে এবং এটি ব্যবহারকারীর কাছে প্রদর্শন করতে চাই:

const blob = new Blob(????, {type: contentType});
const blobUrl = URL.createObjectURL(blob);

window.location = blobUrl;

আমি কীভাবে বিএলএলবি তৈরি করব তা অনুধাবন করতে সক্ষম হইনি।

কিছু ক্ষেত্রে আমি এর data:পরিবর্তে ইউআরএল ব্যবহার করে এড়াতে সক্ষম হয়েছি :

const dataUrl = `data:${contentType};base64,${b64Data}`;

window.location = dataUrl;

তবে বেশিরভাগ ক্ষেত্রে data:ইউআরএলগুলি নিষিদ্ধ হিসাবে বড়।


আমি কীভাবে জাভাস্ক্রিপ্টের একটি BLOB অবজেক্টের একটি বেস 64 স্ট্রিংটি ডিকোড করতে পারি?

উত্তর:


788

atobফাংশন বাইনারি ডেটা প্রতিটি বাইট জন্য একটি অক্ষর দিয়ে একটি নতুন স্ট্রিং মধ্যে একটি Base64- এনকোডেড স্ট্রিং ডিকোড হবে।

const byteCharacters = atob(b64Data);

প্রতিটি অক্ষরের কোড পয়েন্ট (চারকোড) বাইটের মান হবে। .charCodeAtস্ট্রিংয়ের প্রতিটি অক্ষরের জন্য পদ্ধতিটি ব্যবহার করে আমরা বাইট মানগুলির একটি অ্যারে তৈরি করতে পারি ।

const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
    byteNumbers[i] = byteCharacters.charCodeAt(i);
}

আপনি বাইট মানগুলির এই অ্যারেটি Uint8Arrayকনস্ট্রাক্টরকে পাস করে একটি প্রকৃত টাইপড বাইট অ্যারে রূপান্তর করতে পারেন ।

const byteArray = new Uint8Array(byteNumbers);

পরিবর্তে এটিকে একটি অ্যারেতে মুড়িয়ে এবং এটিতে পাস করে একটি বিএলওবিতে রূপান্তর করা যায় Blob নির্মাণকারীর ।

const blob = new Blob([byteArray], {type: contentType});

উপরের কোডটি কাজ করে। তবে byteCharactersএকবারে না হয়ে বরং ছোট ছোট ফালিগুলিতে প্রক্রিয়াজাতকরণের মাধ্যমে কিছুটা উন্নতি করা যেতে পারে । আমার মোটামুটি পরীক্ষায় 512 বাইট ভাল স্লাইস আকার বলে মনে হচ্ছে। এটি আমাদের নিম্নলিখিত ফাংশন দেয়।

const b64toBlob = (b64Data, contentType='', sliceSize=512) => {
  const byteCharacters = atob(b64Data);
  const byteArrays = [];

  for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
    const slice = byteCharacters.slice(offset, offset + sliceSize);

    const byteNumbers = new Array(slice.length);
    for (let i = 0; i < slice.length; i++) {
      byteNumbers[i] = slice.charCodeAt(i);
    }

    const byteArray = new Uint8Array(byteNumbers);
    byteArrays.push(byteArray);
  }

  const blob = new Blob(byteArrays, {type: contentType});
  return blob;
}
const blob = b64toBlob(b64Data, contentType);
const blobUrl = URL.createObjectURL(blob);

window.location = blobUrl;

সম্পূর্ণ উদাহরণ:


6
হাই জেরেমি আমাদের ওয়েব অ্যাপ্লিকেশনটিতে এই কোডটি রয়েছে এবং ফাইলগুলি ডাউনলোড করা আকারে বড় না হওয়া পর্যন্ত এটি কোনও সমস্যা সৃষ্টি করে না cause সুতরাং এটি উত্পাদনের সার্ভারে হ্যাং এবং ক্র্যাশগুলির কারণ হয়ে দাঁড়িয়েছিল, যখন ব্যবহারকারীরা 100 এমএমবি থেকে বড় ফাইল ডাউনলোড করতে Chrome বা IE ব্যবহার করে using আমরা দেখতে পেয়েছি যে নিম্নলিখিত নিম্নলিখিত লাইনে মেমরির ব্যতিক্রম "বার বাইটনামার্স = নতুন অ্যারে (স্লাইস.লেন্থ)" উত্থাপন করছে। তবে ক্রোমে, এটি একই সমস্যার জন্য লুপ ছিল। আমরা এই সমস্যার যথাযথ সমাধান খুঁজে পাইনি তখন আমরা উইন্ডো.ওপেন ব্যবহার করে সরাসরি ফাইলগুলি ডাউনলোড করতে চলেছি। আপনি কি এখানে কিছু সহায়তা সরবরাহ করতে পারেন?
অক্ষয় রাউত

দেশীয় প্রতিক্রিয়াতে কোনও ভিডিও ফাইলকে বেস 64 এ রূপান্তর করার কোনও পদ্ধতি কি? আমি কোনও চিত্র ফাইল দিয়ে এটি পরিচালনা করেছিলাম তবে ভিডিওগুলির জন্য এর জন্য কোনও সমাধান খুঁজে পাই না। লিঙ্কগুলি সহায়ক বা একটি সমাধানও হবে।
দীক্ষা 235

সুতরাং 0 (0) এ স্ট্রিং এ atob () দ্বারা স্টোর করার কোনও সমস্যা নেই?
wcochran

এটি আমার জন্য ক্রোম এবং ফায়ারফক্সে কয়েকটি ব্লকের জন্য কাজ করে নি তবে কিনারায় কাজ করেছে: /
গ্রেগাস আগত

আমার জন্য কাজ করে। এটি একটি ** জেএসএন পার্স ত্রুটি ছুড়ে ফেলেছে: অচেনা টোক '<' ** আমি বেস 64 স্ট্রিংটি একটি ব্রাউজারে রেখে এটি চিত্র তৈরি করছে কিনা তা পরীক্ষা করে দেখলাম। কিছু সাহায্য প্রয়োজন।
আমান দীপ

272

কোনও নির্ভরতা বা লাইব্রেরি ছাড়াই এখানে একটি আরও ন্যূনতম পদ্ধতি।
এটির জন্য নতুন আনার API দরকার। ( আমি এটি ব্যবহার করতে পারি? )

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

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

এই পদ্ধতির সাহায্যে আপনি সহজেই একটি পঠনযোগ্য স্ট্রিম, অ্যারেবফার, পাঠ্য এবং জেএসএন পেতে পারেন।

একটি ফাংশন হিসাবে:

const b64toBlob = (base64, type = 'application/octet-stream') => 
  fetch(`data:${type};base64,${base64}`).then(res => res.blob())

আমি জেরেমির ES6 সিঙ্ক সংস্করণের দিকে একটি সাধারণ পারফরম্যান্স পরীক্ষা করেছি।
সিঙ্ক সংস্করণটি কিছু সময়ের জন্য ইউআইকে ব্লক করবে। ডিভটোল খোলা রেখে আনতে পারফরম্যান্সকে ধীর করতে পারে


1
বেস 64-এনকোড স্ট্রিংয়ের আকারটি বড় হলে এটি কি এখনও কাজ করবে, 665536 অক্ষরের চেয়ে বড় বলি যা অপেরাতে ইউআরআই আকারের সীমা?
ড্যানিয়েল কেটস

1
জানি না, আমি জানি এটি অ্যাড্রেসবারের সীমা হতে পারে তবে এজেএক্সের সাথে জিনিসগুলি করা ব্যতিক্রম হতে পারে কারণ এটি রেন্ডার করতে হবে না। আপনি এটি পরীক্ষা করতে হবে। এটি যদি আমার হয় তবে আমি প্রথম স্থানে বেস 64 স্ট্রিংটি কখনই অর্জন করতে পারতাম না। এটি একটি খারাপ অনুশীলন ভেবে, ডিকোড করতে এবং এনকোড করতে আরও মেমরি এবং সময় নেয়। createObjectURLপরিবর্তে readAsDataURLউদাহরণস্বরূপ অনেক ভাল। এবং আপনি যদি আজাক্স ব্যবহার করে ফাইলগুলি আপলোড করেন তবে তার FormDataপরিবর্তে চয়ন করুন JSONবা এর canvas.toBlobপরিবর্তে ব্যবহার করুনtoDataURL
এন্ডলেস

7
ইনলাইন হিসাবে আরও ভাল:await (await fetch(imageDataURL)).blob()
আইসিএল 7126

3
নিশ্চিত, আপনি যদি সর্বশেষতম ব্রাউজারটিকে লক্ষ্য করে তোলেন। তবে এর জন্য ফাংশনটি একটি অ্যাসিঙ্ক ফাংশনের ভিতরে থাকাও প্রয়োজন। কথা বলছেন ... await fetch(url).then(r=>r.blob())নির্বাচক হয়
ছাত্রলীগ

2
খুব ঝরঝরে সমাধান, তবে আমার জ্ঞান অনুসারে Access is denied.ত্রুটির কারণে IE (পলিফিল অফসি) দিয়ে কাজ করবে না । আমি অনুমান করি যে fetchব্লব URL.createObjectUrlইউআরএলের অধীনে ব্লবটি প্রকাশ করা হয় - একইভাবে হয় - যা আই 11 এ কাজ করবে না। রেফারেন্স । আইই 11 এর সাথে আনতে ব্যবহারের জন্য কিছু কাজ আছে? এটি অন্যান্য সিঙ্ক সমাধানগুলির চেয়ে অনেক বেশি সুন্দর দেখাচ্ছে :)
পাপি

72

অনুকূলিত (তবে কম পাঠযোগ্য) বাস্তবায়ন:

function base64toBlob(base64Data, contentType) {
    contentType = contentType || '';
    var sliceSize = 1024;
    var byteCharacters = atob(base64Data);
    var bytesLength = byteCharacters.length;
    var slicesCount = Math.ceil(bytesLength / sliceSize);
    var byteArrays = new Array(slicesCount);

    for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {
        var begin = sliceIndex * sliceSize;
        var end = Math.min(begin + sliceSize, bytesLength);

        var bytes = new Array(end - begin);
        for (var offset = begin, i = 0; offset < end; ++i, ++offset) {
            bytes[i] = byteCharacters[offset].charCodeAt(0);
        }
        byteArrays[sliceIndex] = new Uint8Array(bytes);
    }
    return new Blob(byteArrays, { type: contentType });
}

2
বাইটগুলিকে টুকরো টুকরো টুকরো করার কি কোনও কারণ আছে? আমি যদি এটি ব্যবহার না করি তবে কোনও অসুবিধা বা ঝুঁকি আছে কি?
আলফ্রেড হুয়াং

আয়নিক 1 / কৌণিক 1. এর সাথে অ্যান্ড্রয়েডে দুর্দান্ত কাজ করে Sl স্লাইস প্রয়োজন অন্যথায় আমি ওওমে চলে যাই (অ্যান্ড্রয়েড 6.0.1) .1
জর্জেন 'কাশবান' ওয়াহলমান

4
কেবলমাত্র উদাহরণস্বরূপ আমি আইই 11 এবং ক্রোম উভয়ই এন্টারপ্রাইজ পরিবেশে যে কোনও ডকুমেন্ট প্রকারের সাথে নির্বিঘ্নে কাজ করতে পারি।
সান্টোস

এটি চমৎকার. ধন্যবাদ!
এলিওটওয়েসফ

একটি ব্যাখ্যা ক্রম হবে। উদাহরণস্বরূপ, কেন এটির উচ্চতর পারফরম্যান্স রয়েছে?
পিটার মর্টেনসেন

19

সমস্ত ব্রাউজার সমর্থনের জন্য, বিশেষত অ্যান্ড্রয়েডে, সম্ভবত আপনি এটি যুক্ত করতে পারেন:

try{
    blob = new Blob(byteArrays, {type : contentType});
}
catch(e){
    // TypeError old Google Chrome and Firefox
    window.BlobBuilder = window.BlobBuilder ||
                         window.WebKitBlobBuilder ||
                         window.MozBlobBuilder ||
                         window.MSBlobBuilder;
    if(e.name == 'TypeError' && window.BlobBuilder){
        var bb = new BlobBuilder();
        bb.append(byteArrays);
        blob = bb.getBlob(contentType);
    }
    else if(e.name == "InvalidStateError"){
        // InvalidStateError (tested on FF13 WinXP)
        blob = new Blob(byteArrays, {type : contentType});
    }
    else{
        // We're screwed, blob constructor unsupported entirely
    }
}

ধন্যবাদ, তবে কোড স্নিপেটে উপরে লেখা দুটি টি সমস্যা আছে যা আমি যদি এটি সঠিকভাবে পড়ে থাকি তবে: (1) ক্যাচের মধ্যে থাকা কোডটি () শেষের দিকে কোডটি চেষ্টা করুন (): "ব্লব = নতুন ব্লব (byteArrays, {প্রকার: বিষয়বস্তু টাইপ}) "... আমি কেন জানি আপনি মূল ব্যতিক্রমের পরে একই কোডটির পুনরাবৃত্তি করার পরামর্শ দিচ্ছেন? ... (2) ব্লববিল্ডার.অ্যাপেন্ড () বাইট-অ্যারেগুলি ছাড়া অ্যারেবফার গ্রহণ করতে পারে না। সুতরাং, এই API ব্যবহার করার আগে ইনপুট বাইটস-অ্যারেগুলি আরও তার অ্যারেবফারে রূপান্তর করতে হবে। রেফ: ডেভেলপার.মোজিলা.আর.ইন-
ইউএস / ডকস / ওয়েবে / এপিআই / ব্লব বিল্ডার

14

চিত্রের ডেটার জন্য, আমি এটি ব্যবহার করা সহজ বলে মনে করি canvas.toBlob(অ্যাসিনক্রোনাস)

function b64toBlob(b64, onsuccess, onerror) {
    var img = new Image();

    img.onerror = onerror;

    img.onload = function onload() {
        var canvas = document.createElement('canvas');
        canvas.width = img.width;
        canvas.height = img.height;

        var ctx = canvas.getContext('2d');
        ctx.drawImage(img, 0, 0, canvas.width, canvas.height);

        canvas.toBlob(onsuccess);
    };

    img.src = b64;
}

var base64Data = 'data:image/jpg;base64,/9j/4AAQSkZJRgABAQA...';
b64toBlob(base64Data,
    function(blob) {
        var url = window.URL.createObjectURL(blob);
        // do something with url
    }, function(error) {
        // handle error
    });

1
আমার মনে হয় আপনি সেই সাথে কিছু তথ্য আলগা করেছেন ... যেমন মেটা ইনফো যেমন কোনও চিত্রকে পিএনজিতে রূপান্তরিত করার মতো, তাই এটি একই ফলাফল নয়, এটি কেবল চিত্রগুলির জন্যও কাজ করে
অন্তহীন

আমার ধারণা আপনি image/jpgবেস 64 স্ট্রিং থেকে চিত্রের প্রকারটি বের করে এবং এটি দ্বিতীয় প্যারামিটার হিসাবে toBlobফাংশন হিসাবে পাস করার মাধ্যমে এটি উন্নতি করতে পারে যাতে ফলাফল একই রকম হয়। এগুলি ছাড়াও আমি এটি নিখুঁত বলে মনে করি - এটি সার্ভারে 30% ট্র্যাফিক এবং আপনার ডিস্কের স্থান সংরক্ষণ করে (বেস 64 এর তুলনায়) এবং এটি স্বচ্ছ পিএনজি দিয়েও দুর্দান্ত কাজ করে।
icl7126

1
ফাংশনটি 2MB এর চেয়ে বড় চিত্রগুলির সাথে ক্র্যাশ হয়ে গেছে ... অ্যান্ড্রয়েডে আমি ব্যতিক্রম পেয়েছি: android.os.TransactionTooLarge
রুবেন

14

এই উদাহরণটি দেখুন: https://jsfiddle.net/pqhdce2L/

function b64toBlob(b64Data, contentType, sliceSize) {
  contentType = contentType || '';
  sliceSize = sliceSize || 512;

  var byteCharacters = atob(b64Data);
  var byteArrays = [];

  for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
    var slice = byteCharacters.slice(offset, offset + sliceSize);

    var byteNumbers = new Array(slice.length);
    for (var i = 0; i < slice.length; i++) {
      byteNumbers[i] = slice.charCodeAt(i);
    }

    var byteArray = new Uint8Array(byteNumbers);

    byteArrays.push(byteArray);
  }
    
  var blob = new Blob(byteArrays, {type: contentType});
  return blob;
}


var contentType = 'image/png';
var b64Data = Your Base64 encode;

var blob = b64toBlob(b64Data, contentType);
var blobUrl = URL.createObjectURL(blob);

var img = document.createElement('img');
img.src = blobUrl;
document.body.appendChild(img);


একটি ব্যাখ্যা ক্রম হবে।
পিটার মর্টেনসেন

9

আমি লক্ষ্য করেছি যে জেরেমির পরামর্শ মতো ডেটা টুকরো টুকরো করার সময় ইন্টারনেট এক্সপ্লোরার 11 অবিশ্বাস্যরকম ধীর হয়ে যায়। এটি ক্রোমের পক্ষে সত্য, তবে কাটা ডেটা ব্লব-কনস্ট্রাক্টরের কাছে যাওয়ার সময় ইন্টারনেট এক্সপ্লোরারকে সমস্যা বলে মনে হচ্ছে। আমার মেশিনে, 5 এমবি ডেটা পাস করা ইন্টারনেট এক্সপ্লোরারকে ক্র্যাশ করে তোলে এবং মেমরির খরচ ছাদের মধ্য দিয়ে চলছে। ক্রোম কোনও দিনেই ব্লব তৈরি করে।

তুলনার জন্য এই কোডটি চালান:

var byteArrays = [],
    megaBytes = 2,
    byteArray = new Uint8Array(megaBytes*1024*1024),
    block,
    blobSlowOnIE, blobFastOnIE,
    i;

for (i = 0; i < (megaBytes*1024); i++) {
    block = new Uint8Array(1024);
    byteArrays.push(block);
}

//debugger;

console.profile("No Slices");
blobSlowOnIE = new Blob(byteArrays, { type: 'text/plain'});
console.profileEnd();

console.profile("Slices");
blobFastOnIE = new Blob([byteArray], { type: 'text/plain'});
console.profileEnd();

সুতরাং আমি জেরেমি দ্বারা বর্ণিত দুটি পদ্ধতিকে একটি ফাংশনে অন্তর্ভুক্ত করার সিদ্ধান্ত নিয়েছি। ক্রেডিট এই জন্য তার কাছে যান।

function base64toBlob(base64Data, contentType, sliceSize) {

    var byteCharacters,
        byteArray,
        byteNumbers,
        blobData,
        blob;

    contentType = contentType || '';

    byteCharacters = atob(base64Data);

    // Get BLOB data sliced or not
    blobData = sliceSize ? getBlobDataSliced() : getBlobDataAtOnce();

    blob = new Blob(blobData, { type: contentType });

    return blob;


    /*
     * Get BLOB data in one slice.
     * => Fast in Internet Explorer on new Blob(...)
     */
    function getBlobDataAtOnce() {
        byteNumbers = new Array(byteCharacters.length);

        for (var i = 0; i < byteCharacters.length; i++) {
            byteNumbers[i] = byteCharacters.charCodeAt(i);
        }

        byteArray = new Uint8Array(byteNumbers);

        return [byteArray];
    }

    /*
     * Get BLOB data in multiple slices.
     * => Slow in Internet Explorer on new Blob(...)
     */
    function getBlobDataSliced() {

        var slice,
            byteArrays = [];

        for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
            slice = byteCharacters.slice(offset, offset + sliceSize);

            byteNumbers = new Array(slice.length);

            for (var i = 0; i < slice.length; i++) {
                byteNumbers[i] = slice.charCodeAt(i);
            }

            byteArray = new Uint8Array(byteNumbers);

            // Add slice
            byteArrays.push(byteArray);
        }

        return byteArrays;
    }
}

এটি অন্তর্ভুক্ত করার জন্য আপনাকে ধন্যবাদ। আইই 11-এ সাম্প্রতিক আপডেটের সাথে (5/2016 এবং 8/2016 এর মধ্যে), অ্যারে থেকে ব্লবগুলি তৈরি করা আরও বেশি পরিমাণে র‌্যাম নিতে শুরু করেছে। ব্লগ নির্মাণকারীকে একটি একক Uint8Array প্রেরণ করে, এটি প্রায় কোনও র্যাম ব্যবহার করে না এবং প্রকৃতপক্ষে প্রক্রিয়াটি সম্পন্ন করে।
অ্যান্ড্রু ভোগেল

পরীক্ষার নমুনায় স্লাইজের আকার 1K থেকে 8..16K-তে বাড়ানো IE এ সময় উল্লেখযোগ্যভাবে হ্রাস করে। আমার পিসিতে মূল কোডটি 5 থেকে 8 সেকেন্ড পর্যন্ত লেগেছে, 8 কে ব্লক সহ কোডটি কেবল 356 মিমি এবং 16 কে ব্লকের জন্য 225 মিমি নিয়েছে
ভিক্টর

5

আপনি যদি আপনার প্রকল্পে একটি নির্ভরতা যুক্ত করতে পারেন তবে দুর্দান্ত blob-utilএনপিএম প্যাকেজ রয়েছে যা একটি base64StringToBlobকার্যকর ফাংশন সরবরাহ করে। আপনার সাথে একবার যুক্ত হয়ে গেলে package.jsonআপনি এটি ব্যবহার করতে পারেন:

import { base64StringToBlob } from 'blob-util';

const contentType = 'image/png';
const b64Data = 'iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==';

const blob = base64StringToBlob(b64Data, contentType);

// Do whatever you need with your blob...

5

আমার মতো সমস্ত অনুলিপি-পেস্ট প্রেমীদের জন্য, এখানে একটি রান্না করা ডাউনলোড ফাংশন যা ক্রোম, ফায়ারফক্স এবং এজে কাজ করে:

window.saveFile = function (bytesBase64, mimeType, fileName) {
var fileUrl = "data:" + mimeType + ";base64," + bytesBase64;
fetch(fileUrl)
    .then(response => response.blob())
    .then(blob => {
        var link = window.document.createElement("a");
        link.href = window.URL.createObjectURL(blob, { type: mimeType });
        link.download = fileName;
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
    });
}

createObjectURLএকটি 2nd যুক্তি গ্রহণ করা হয় না ...
ছাত্রলীগ

3

বেস বেস 64 রূপান্তরকরণের আরও ঘোষিত উপায় পোস্ট করছি। যদিও অ্যাসিঙ্কটি fetch().blob()খুব ঝরঝরে এবং আমি এই সমাধানটি অনেক পছন্দ করি তবে এটি ইন্টারনেট এক্সপ্লোরার 11-এ কাজ করে না (এবং সম্ভবত এজ - আমি এটি পরীক্ষা করিনি) এমনকি পলিফিল দিয়েও - অন্তহীন আমার মন্তব্যটি একবার দেখুন আরও বিশদ জন্য পোস্ট করুন।

const blobPdfFromBase64String = base64String => {
   const byteArray = Uint8Array.from(
     atob(base64String)
       .split('')
       .map(char => char.charCodeAt(0))
   );
  return new Blob([byteArray], { type: 'application/pdf' });
};

বোনাস

আপনি যদি এটি মুদ্রণ করতে চান তবে আপনি কিছু করতে পারেন:

const isIE11 = !!(window.navigator && window.navigator.msSaveOrOpenBlob); // Or however you want to check it
const printPDF = blob => {
   try {
     isIE11
       ? window.navigator.msSaveOrOpenBlob(blob, 'documents.pdf')
       : printJS(URL.createObjectURL(blob)); // http://printjs.crabbly.com/
   } catch (e) {
     throw PDFError;
   }
};

বোনাস এক্স 2 - ইন্টারনেট এক্সপ্লোরার 11 এর জন্য নতুন ট্যাবে একটি বিএলওবি ফাইল খুলছে

আপনি যদি সার্ভারে বেস 64 স্ট্রিংটির কিছু প্রিপ্রোসেসিং করতে সক্ষম হন তবে আপনি এটি কিছু URL এর অধীনে প্রকাশ করতে এবং লিঙ্কটি ব্যবহার করতে পারবেন printJS:)


2

নীচে আমার টাইপস্ক্রিপ্ট কোড যা যা জাভাস্ক্রিপ্টে সহজে রূপান্তরিত হতে পারে এবং আপনি ব্যবহার করতে পারেন

/**
 * Convert BASE64 to BLOB
 * @param Base64Image Pass Base64 image data to convert into the BLOB
 */
private convertBase64ToBlob(Base64Image: any) {
    // Split into two parts
    const parts = Base64Image.split(';base64,');

    // Hold the content type
    const imageType = parts[0].split(':')[1];

    // Decode Base64 string
    const decodedData = window.atob(parts[1]);

    // Create UNIT8ARRAY of size same as row data length
    const uInt8Array = new Uint8Array(decodedData.length);

    // Insert all character code into uInt8Array
    for (let i = 0; i < decodedData.length; ++i) {
        uInt8Array[i] = decodedData.charCodeAt(i);
    }

    // Return BLOB image after conversion
    return new Blob([uInt8Array], { type: imageType });
}

4
যদিও এই কোড স্নিপেট একটি সমাধান সহ সমাধান হতে পারে, সত্যিই আপনার পোস্টের গুণমান উন্নত করতে সহায়তা করে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, এবং সেই লোকেরা আপনার কোড পরামর্শের কারণগুলি জানেন না।
জোহান

2
এছাড়াও, আপনি কেন মন্তব্যগুলিতে ইয়েলিং করছেন?
ক্যানব্যাক্স

4
আপনার Typescript codeকোডটিতে কেবল একটি সিঙ্গেল টাইপ রয়েছে এবং এটি টাইপ any। এমনকি কেন বিরক্ত ??
zoran404

0

আনার সাথে পদ্ধতিটি সর্বোত্তম সমাধান, তবে যদি কারও যদি আনতে না পারে এমন কোনও পদ্ধতি ব্যবহারের প্রয়োজন হয় তবে এটি এখানে রয়েছে, যেমন পূর্বে উল্লিখিত পদ্ধতিগুলি আমার পক্ষে কার্যকর হয়নি:

function makeblob(dataURL) {
    const BASE64_MARKER = ';base64,';
    const parts = dataURL.split(BASE64_MARKER);
    const contentType = parts[0].split(':')[1];
    const raw = window.atob(parts[1]);
    const rawLength = raw.length;
    const uInt8Array = new Uint8Array(rawLength);

    for (let i = 0; i < rawLength; ++i) {
        uInt8Array[i] = raw.charCodeAt(i);
    }

    return new Blob([uInt8Array], { type: contentType });
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.