Skip to content

Instantly share code, notes, and snippets.

@fupslot
Created February 22, 2013 19:23
Show Gist options
  • Star 59 You must be signed in to star a gist
  • Fork 7 You must be signed in to fork a gist
  • Save fupslot/5015897 to your computer and use it in GitHub Desktop.
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
Copy link

danimt commented Apr 17, 2015

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

@AshwinMekala
Copy link

saved my life!

@dkaranja
Copy link

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
Copy link

panzerdp commented Oct 2, 2015

Thanks @dkaranja, it worked well. +1

@krusk
Copy link

krusk commented Oct 6, 2015

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

@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

thank you, it works @dkaranja

@fabianobizarro
Copy link

Thanks man!

@NChary
Copy link

NChary commented Nov 7, 2016

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

@Krishna25Vrinsoft
Copy link

It's not working in Android 4.2 version OS

@otiai10
Copy link

otiai10 commented Feb 19, 2017

thanks. it saved my life time.

@jyotendra
Copy link

jyotendra commented Mar 6, 2017

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

thank you

@noonon
Copy link

noonon commented Jun 14, 2017

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
Copy link

mail19 commented Jun 28, 2017

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

@suresh2018
Copy link

thanks a lot @fubslot

Copy link

ghost commented Jun 27, 2018

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

@panchihpeng
Copy link

wonderful !

@andrew-d-moore
Copy link

@noonon solution still working. Thanks

@heart-01
Copy link

heart-01 commented Oct 1, 2022

thank you

@abhinav-official
Copy link

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

@franconisi
Copy link

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

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