Skip to content

Instantly share code, notes, and snippets.

@fupslot
Created February 22, 2013 19:23
Show Gist options
  • Select an option

  • Save fupslot/5015897 to your computer and use it in GitHub Desktop.

Select an option

Save fupslot/5015897 to your computer and use it in GitHub Desktop.
Javascript: Convert base64 to a Blob
function dataURItoBlob(dataURI, callback) {
// 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);
var ia = new Uint8Array(ab);
for (var i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
// write the ArrayBuffer to a blob, and you're done
var bb = new BlobBuilder();
bb.append(ab);
return bb.getBlob(mimeString);
}
@danimt

danimt commented Apr 17, 2015

Copy link
Copy Markdown

Thank you for your kind contribution to humanity, Sir! ;)

@AshwinMekala

Copy link
Copy Markdown

saved my life!

@dkaranja

Copy link
Copy Markdown

I believe the BlobBuilder class is deprecated. Here's a correct representation of the same

function dataURItoBlob(dataURI, callback) {
    // 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);
    var ia = new Uint8Array(ab);
    for (var i = 0; i < byteString.length; i++) {
        ia[i] = byteString.charCodeAt(i);
    }

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

@panzerdp

panzerdp commented Oct 2, 2015

Copy link
Copy Markdown

Thanks @dkaranja, it worked well. +1

@krusk

krusk commented Oct 6, 2015

Copy link
Copy Markdown

Where would we define the content type (ex. 'image/png') in the example provided by @dkaranja? I don't see how the mimeString get's reincorporated in the code.

@alexmateos

Copy link
Copy Markdown

@krusk

function dataURItoBlob(dataURI, callback) {
// 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);
var ia = new Uint8Array(ab);
for (var i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}

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

@JackieLin

Copy link
Copy Markdown

thank you, it works @dkaranja

@fabianobizarro

Copy link
Copy Markdown

Thanks man!

@NChary

NChary commented Nov 7, 2016

Copy link
Copy Markdown

I am really appreciated effort which you have put in for this solution. Thank you so much.

@Krishna25Vrinsoft

Copy link
Copy Markdown

It's not working in Android 4.2 version OS

@otiai10

otiai10 commented Feb 19, 2017

Copy link
Copy Markdown

thanks. it saved my life time.

@jyotendra

jyotendra commented Mar 6, 2017

Copy link
Copy Markdown

You probably wanted to form blob of "Uint8Array" (ia) and ended up using "arrayBuffer" (ab). If not, then what's the use of declaring "ia" in the first place ? It's not being used actively anywhere.

@YoungWookCho

Copy link
Copy Markdown

thank you

@noonon

noonon commented Jun 14, 2017

Copy link
Copy Markdown

My example

function dataURIToBlob(dataURI) {
    dataURI = dataURI.replace(/^data:/, '');

    const type = dataURI.match(/image\/[^;]+/);
    const base64 = dataURI.replace(/^[^,]+,/, '');
    const arrayBuffer = new ArrayBuffer(base64.length);
    const typedArray = new Uint8Array(arrayBuffer);

    for (let i = 0; i < base64.length; i++) {
        typedArray[i] = base64.charCodeAt(i);
    }

    return new Blob([arrayBuffer], {type});
}

@mail19

mail19 commented Jun 28, 2017

Copy link
Copy Markdown

Life saver! It works great even for pdf or xps or .exe files

@suresh2018

Copy link
Copy Markdown

thanks a lot @fubslot

ghost commented Jun 27, 2018

Copy link
Copy Markdown

Thanks so much :) Tremendous help for me using Expo Image Picker and uploading to Google Storage.

@panchihpeng

Copy link
Copy Markdown

wonderful !

@andrew-d-moore

Copy link
Copy Markdown

@noonon solution still working. Thanks

@heart-01

heart-01 commented Oct 1, 2022

Copy link
Copy Markdown

thank you

@abhinav-official

Copy link
Copy Markdown

[Error: Creating blobs from 'ArrayBuffer' and 'ArrayBufferView' are not supported]}

@franconisi

Copy link
Copy Markdown

Thanks @noonon its working! I would help converting it to TS

function dataURIToBlob(dataURI: string) {
  dataURI = dataURI.replace(/^data:/, '');

  const type = dataURI.match(/image\/[^;]+/)[0];
  const base64 = dataURI.replace(/^[^,]+,/, '');
  const arrayBuffer = new ArrayBuffer(base64.length);
  const typedArray = new Uint8Array(arrayBuffer);

  for (let i = 0; i < base64.length; i++) {
    typedArray[i] = base64.charCodeAt(i);
  }

  return new Blob([arrayBuffer], { type });
}

@nicholaslck

nicholaslck commented Jul 29, 2024

Copy link
Copy Markdown

This is great! thank you @franconisi

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment