How to get a File() or Blob() from an URL in javascript?
Asked Answered
C

5

56

I try to upload an image to the Firebase storage from an URL (with ref().put(file))(www.example.com/img.jpg).

To do so i need a File or Blob, but whenever I try new File(url) it says "not enough arguments“…

EDIT: And I actually want to upload a whole directory of files, that’s why i can’t upload them via Console

Case answered 19/5, 2017 at 12:41 Comment(2)
Which environment are you running Javascript in? File can't take a URL and fetch it for you, you'll have to fetch it, read its data and create the File object with that data.Propagandize
Yup, javascript. And you where right, thx so much for the fast answer ^^Case
D
103

Try using the fetch API. You can use it like so:

fetch('https://upload.wikimedia.org/wikipedia/commons/7/77/Delete_key1.jpg')
  .then(res => res.blob()) // Gets the response and returns it as a blob
  .then(blob => {
    // Here's where you get access to the blob
    // And you can use it for whatever you want
    // Like calling ref().put(blob)

    // Here, I use it to make an image appear on the page
    let objectURL = URL.createObjectURL(blob);
    let myImage = new Image();
    myImage.src = objectURL;
    document.getElementById('myImg').appendChild(myImage)
});
<div id="myImg"></div>

As of January 2024, the fetch API has about 98% browser support worldwide, with basically just IE missing it. You can get that to near 100% using a polyfill, which I recommend if you're still targeting IE.

Deflexed answered 19/5, 2017 at 12:48 Comment(3)
why use two .thens instead of just one which does res.blob at the beginningButcherbird
res.blob() returns a promise, so we need to wait for it to resolve before accessing the contents: developer.mozilla.org/en-US/docs/Web/API/Body/blobDeflexed
You will probalby get error "No 'Access-Control-Allow-Origin' header is present on the requested resource", if so you can use url proxy like proxy= cors-anywhere.herokuapp.com (or setup your own) then url = proxy + url, and use proxied url to fetch data. Here is a broad answer to this problem https://mcmap.net/q/73952/-trying-to-use-fetch-and-pass-in-mode-no-corsArakawa
L
5

@James answer is correct but it is not compatible with all browsers. You can try this jQuery solution :

$.get('blob:yourbloburl').then(function(data) {
  var blob = new Blob([data], { type: 'audio/wav' });
});
Libbi answered 10/12, 2017 at 23:23 Comment(1)
This is not a pure javascript solution but a jQuery one, you should definitely mention that in the answer.Strenuous
S
1

It did not work until I added credentials

fetch(url, {
      headers: {
        "Content-Type": "application/octet-stream",
      },
      credentials: 'include'
 })
Sheffield answered 6/9, 2018 at 12:46 Comment(0)
C
1
async function url2blob(url) {
  try {
    const data = await fetch(url);
    const blob = await data.blob();
    await navigator.clipboard.write([
      new ClipboardItem({
        [blob.type]: blob
      })
    ]);
    console.log("Success.");
  } catch (err) {
    console.error(err.name, err.message);
  }
}
Columbarium answered 10/11, 2020 at 15:13 Comment(0)
B
-2

If you are using homepage in package.json then ypu have to use:

CurrentUrl: http://localhost:3008/tempAppHomepageFromPackageJson/

const file: File = this.state.file;
const localUrlToFile = URL.createObjectURL(file);
const fileHash = localUrlToFile.split('/');
const objectUrl = location.href + fileHash[fileHash.length - 1];

objectUrl is the local url to file. For example to show in runtime you uploading file.

Second solution is (if you have no homepage in package.json):

const file: File = this.state.file;
const objectUrl = window.URL.createObjectURL(file);

Third solution (Not working in safari):

const file: File = this.state.file;
let reader = new FileReader();
reader.readAsDataURL(file);
const objectUrl = reader.result as string;

Enjoy ;)

Burkes answered 16/4, 2021 at 12:24 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.