Convert URL to File or Blob for FileReader.readAsDataURL

Reference: FileReader.readAsDataURL

Considering the following example:

function previewFile(file) {

  var reader  = new FileReader();

  reader.onloadend = function () {

It states:


blob: The Blob or File from which to read.

  1. How can a local file URL like: 'file:///C:/path-to/root.png' be passed to the readAsDataURL()

  2. Is FileReader() available in a Firefox Addon?

Asked By: erosman

Answer #1:

This information is outdated as of now, but cannot be deleted.

  1. You can create File instances just by specifying a path when your code is chrome-privileged:

    new File("/path/to/file");

    File is a sub-class of Blob, so all File instances are also valid Blobs. Please note that this requires a platform path, and not a file URL.

  2. Yes, FileReader is available to addons.

File and FileReader are available in all windows. If you want to use them in a non-window scope (like bootstrap.js or a code module), you may use nsIDOMFile/nsIDOMFileReader.

Answered By: erosman

Answer #2:

To convert a URL to a Blob for FileReader.readAsDataURL() do this:

var request = new XMLHttpRequest();'GET', MY_URL, true);
request.responseType = 'blob';
request.onload = function() {
    var reader = new FileReader();
    reader.onload =  function(e){
Answered By: nmaier

Answer #3:

Expanding on Felix Turner s response, here is how I would use this approach with the fetch API.

async function createFile(){
  let response = await fetch('');
  let data = await response.blob();
  let metadata = {
    type: 'image/jpeg'
  let file = new File([data], "test.jpg", metadata);
  // ... do something with the file or return it
Answered By: Felix Turner

Answer #4:

Try this I learned this from @nmaier when I was mucking around with converting to ico: Well i dont really understand what array buffer is but it does what we need:

function previewFile(file) {

  var reader  = new FileReader();

  reader.onloadend = function () {
    console.log(reader.result); //this is an ArrayBuffer

notice how i just changed your readAsDataURL to readAsArrayBuffer.

Here is the example @nmaier gave me:

it has a fiddle

if you want to take this and make a file out of it i would think you would use file-output-stream in the onloadend

Answered By: Tibor Udvari

Answer #5:

The suggested edit queue is full for @tibor-udvari's excellent fetch answer, so I'll post my suggested edits as a new answer.

This function gets the content type from the header if returned, otherwise falls back on a settable default type.

async function getFileFromUrl(url, name, defaultType = 'image/jpeg'){
  const response = await fetch(url);
  const data = await response.blob();
  return new File([data], name, {
    type: response.headers.get('content-type') || defaultType,

// `await` can only be used in an async body, but showing it here for simplicity.
const file = await getFileFromUrl('', 'example.jpg');
Answered By: Noitidart

Answer #6:

Here is my code using async awaits and promises

const getBlobFromUrl = (myImageUrl) => {
    return new Promise((resolve, reject) => {
        let request = new XMLHttpRequest();'GET', myImageUrl, true);
        request.responseType = 'blob';
        request.onload = () => {
        request.onerror = reject;

const getDataFromBlob = (myBlob) => {
    return new Promise((resolve, reject) => {
        let reader = new FileReader();
        reader.onload = () => {
        reader.onerror = reject;

const convertUrlToImageData = async (myImageUrl) => {
    try {
        let myBlob = await getBlobFromUrl(myImageUrl);
        let myImageData = await getDataFromBlob(myBlob);
        return myImageData;
    } catch (err) {
        return null;

export default convertUrlToImageData;
Answered By: Krista

Answer #7:

I know this is an expansion off of @tibor-udvari's answer, but for a nicer copy and paste.

async function createFile(url, type){
  if (typeof window === 'undefined') return // make sure we are in the browser
  const response = await fetch(url)
  const data = await response.blob()
  const metadata = {
    type: type || 'video/quicktime'
  return new File([data], url, metadata)
Answered By: jbailey

Answer #8:

Add cors mode to prevent files cors blocked

                    .then(res => res.blob())
                    .then(blob => {
                        const file = new File([blob], 'dot.png', {type:'image/png'});
Answered By: Alex Cory
The answers/resolutions are collected from stackoverflow, are licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0 .

# More Articles