Hardik Mandankaa
Hardik Mandankaa

Reputation: 3376

Failed to execute 'createObjectURL' on 'URL':

Display Below error in Safari.

Failed to execute 'createObjectURL' on 'URL': No function was found that matched the signature provided.

My Code is:

function createObjectURL(object) {
    return (window.URL) ? window.URL.createObjectURL(object) : window.webkitURL.createObjectURL(object);
}

This is my Code for image:

function myUploadOnChangeFunction() { 
    if (this.files.length) { 
       for (var i in this.files) { 
           if (this.files.hasOwnProperty(i)) { 
              var src = createObjectURL(this.files[i]); 
              var image = new Image(); 
              image.src = src; 
              imagSRC = src; 
              $('#img').attr('src', src); 
            }
       }           
   } 
} 

Upvotes: 274

Views: 557794

Answers (14)

In case you're using Axios and noticed my comment, just add this line: responseType: 'blob'

the full code would be:

const response = await axios.get(`/example/image`, {
      responseType: 'blob' // This ensures the response is treated as binary data (Blob)
});

This tells Axios to handle the response as a Blob, which is useful when dealing with binary data such as images or file downloads.

GLHF :)

Upvotes: 0

Ujjwal Singh
Ujjwal Singh

Reputation: 4988

In jQuery - I had to add:

    xhrFields: {
        responseType: 'blob'
    }

to data: of my request

Upvotes: 0

Jokanola
Jokanola

Reputation: 88

I was able to fix this by checking if the object is null. {object ? URL.createObjectURL(object) : "default.png"}

This made me to conclude that the error occur when object is null.

Upvotes: 2

Eduardo Marçal
Eduardo Marçal

Reputation: 21

//my code was:

this._videoEl = videoEl;
        navigator.mediaDevices.getUserMedia({
            video : true
        }).then(stream => {
            this._videoEl.src = URL.createObjectURL(stream);
            this._videoEl.play();
        }).catch(err => {
            console.log(err);
        });

//and replace to this worked for me :

this._videoEl = videoEl;
        navigator.mediaDevices.getUserMedia({
            video : true
        }).then(stream => {
            this._videoEl.srcObject = stream;
            this._videoEl.play();
        }).catch(err => {
            console.log(err);
        });

Upvotes: 2

AutoCiudad
AutoCiudad

Reputation: 779

I fixed it bydownloading the latest version from GitHub

Upvotes: -12

KushalSeth
KushalSeth

Reputation: 4629

I tried few things, but for me simply assigning stream to src worked.

video.srcObject=stream;

Upvotes: 0

Christian
Christian

Reputation: 2194

This error is caused because the function createObjectURL no longer accepts media stream object for Google Chrome

I changed this:

video.src=vendorUrl.createObjectURL(stream);
video.play();

to this:

video.srcObject=stream;
video.play();

This worked for me.

Upvotes: 192

tech_ank
tech_ank

Reputation: 57

If you are using angular this tutorial will be helpful: link. However you will need to replace this line:

this.video.src = window.URL.createObjectURL(stream);

with this, since createObjectURL() is deprecated on chrome for MediaStream.

this.video.srcObject = stream;

Upvotes: 2

mimo
mimo

Reputation: 6817

I experienced the same error, when I passed raw data to createObjectURL:

window.URL.createObjectURL(data)

It has to be a Blob, File or MediaSource object, not data itself. This worked for me:

var binaryData = [];
binaryData.push(data);
window.URL.createObjectURL(new Blob(binaryData, {type: "application/zip"}))

Check also the MDN for more info: https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL


UPDATE

Back in the day we could also use createObjectURL() method with MediaStream objects. This use has been dropped by the specs and by browsers.
If you need to set a MediaStream as the source of an HTMLMediaElement just attach the MediaStream object directly to the srcObject property of the HTMLMediaElement e.g. <video> element.

const mediaStream = new MediaStream();
const video = document.getElementById('video-player');
video.srcObject = mediaStream;

However, if you need to work with MediaSource, Blob or File, you still have to create a blob:// URL with URL.createObjectURL() and assign it to HTMLMediaElement.src.

Read more details here: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/srcObject

Upvotes: 308

Dani Amsalem
Dani Amsalem

Reputation: 1616

My code was broken because I was using a deprecated technique. It used to be this:

video.src = window.URL.createObjectURL(localMediaStream);
video.play();

Then I replaced that with this:

video.srcObject = localMediaStream;
video.play();

That worked beautifully.

EDIT: Recently localMediaStream has been deprecated and replaced with MediaStream. The latest code looks like this:

video.srcObject = new MediaStream();

References:

  1. Deprecated technique: https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL
  2. Modern deprecated technique: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/srcObject
  3. Modern technique: https://developer.mozilla.org/en-US/docs/Web/API/MediaStream

Upvotes: 38

Guilherme Porto
Guilherme Porto

Reputation: 131

If you are using ajax, it is possible to add the options xhrFields: { responseType: 'blob' }:

$.ajax({
  url: 'yourURL',
  type: 'POST',
  data: yourData,
  xhrFields: { responseType: 'blob' },
  success: function (data, textStatus, jqXHR) {
    let src = window.URL.createObjectURL(data);
  }
});

Upvotes: 2

eddyparkinson
eddyparkinson

Reputation: 3700

Video with fall back:

try {
  video.srcObject = mediaSource;
} catch (error) {
  video.src = URL.createObjectURL(mediaSource);
}
video.play();

From: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/srcObject

Upvotes: 10

max.kovpak
max.kovpak

Reputation: 91

I had the same error for the MediaStream. The solution is set a stream to the srcObject.

From the docs:

Important: If you still have code that relies on createObjectURL() to attach streams to media elements, you need to update your code to simply set srcObject to the MediaStream directly.

Upvotes: 9

Hiago Takaki
Hiago Takaki

Reputation: 188

The problem is that the keys provided in the loop do not refer to the index of the file.

for (var i in this.files) {
    console.log(i);
}

The output of the above code is:

0
length
item

But what was expected was:

0
1
2
etc...

Then the error occurs when the browser tries to execute, for example:

window.URL.createObjectURL(this.files["length"])

I suggest implementation based on the following code:

var files = this.files;
for (var i = 0; i < files.length; i++) {
    var file = files[i],
        src = (window.URL || window.webkitURL).createObjectURL(file);
    ...
}

I hope this can help someone.

Greetings!

Upvotes: 5

Related Questions