Falha ao executar 'createObjectURL' no 'URL':


132

Erro de exibição abaixo no Safari.

Falha ao executar 'createObjectURL' no 'URL': Nenhuma função foi encontrada que corresponda à assinatura fornecida.

Meu código é:

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

Este é o meu código de imagem:

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

6
Oi Hardik, o que você está passando para a sua createObjectURL(...)função quando recebe esse erro?
Arthur Weborg

2
objeto deve ser um objeto de arquivo ou um objeto Blob para criar um objeto URL for.see devdocs.io/dom/window.url.createobjecturl
yxf

1
Este é o meu código para a imagem: function myUploadOnChangeFunction () {if (this.files.length) {for (vari in this.files) {if (this.files.hasOwnProperty (i)) {var src = createObjectURL (this. arquivos [i]); var imagem = nova imagem (); image.src = src; imagSRC = src; $ ('# img'). attr ('src', src); }}}}
Hardik Mandankaa 25/11

@HardikMansaraa Vá em frente e edite-o na sua pergunta.
soktinpk

window.URL.createObjectURL('broken')lança um erro:Uncaught TypeError: Failed to execute 'createObjectURL' on 'URL': No function was found that matched the signature provided.
Juan Mendes

Respostas:


150

ATUALIZAR

Considere evitar o createObjectURL()método, enquanto os navegadores estão desativando o suporte a ele. Basta anexar o MediaStreamobjeto diretamente à srcObjectpropriedade do elemento HTMLMediaElementeg <video>.

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

No entanto, se você precisar trabalhar com MediaSource, Blobou File, precisará criar um URL URL.createObjectURL()e atribuí-lo a HTMLMediaElement.src.

Leia mais detalhes aqui: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/srcObject


Resposta mais antiga

Eu experimentei o mesmo erro quando passei para createObjectURLdados brutos:

window.URL.createObjectURL(data)

Tem que ser Blob, Fileou MediaSourceobjeto, não os dados em si. Isso funcionou para mim:

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

Verifique também o MDN para obter mais informações: https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL


2
Oi. O que fazer se estiver lidando com "application / pdf"? Estou recebendo o mesmo erro no console quando estou lidando com o arquivo PDF
N Sharma

@ mimo Estou usando o mesmo código para baixar o arquivo. Mas dois arquivos estão sendo baixados. Um é o arquivo correto e um arquivo extra com o mesmo nome, mas o status com falha está sendo baixado. Você tem alguma idéia de por que isso está acontecendo?
Shardul 13/03/19

Estou confuso com este comentário, no MDN desencoraja o uso de URL.createObjectURL()para fluxos de mídia. No entanto, ele não declara NÃO usá-lo para uma entrada de arquivo, como indicado na pergunta inicial.
alextrastero

140

Este erro foi causado porque a função createObjectURLfoi descontinuada para o Google Chrome

Eu mudei isso:

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

para isso:

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

Isso funcionou para mim.



createObjectURL não é obsoleto como mostrado aqui , mas já não aceita material de fluxo de objeto
goodies4uall

Essa deve ser a resposta.
DomingoR

existe outro problema video.play () parece estar restrito: DOMException: play () pode ser iniciado apenas por um gesto do usuário.
user889030 24/03

@ user889030 que significa apenas que você não pode abrir uma página da web e esperar que o fluxo da webcam seja iniciado. Você deve permitir que o usuário inicie explicitamente o fluxo. Basta usar um botão para iniciar o fluxo
S.Ramjit

26

Meu código foi quebrado porque eu estava usando uma técnica obsoleta. Costumava ser isso:

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

Então substituí isso por:

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

Isso funcionou lindamente.

EDIT: recentemente localMediaStreamfoi preterido e substituído por MediaStream. O código mais recente é assim:

video.srcObject = MediaStream;

Referências:

  1. Técnica descontinuada: https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL
  2. Técnica obsoleta moderna: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/srcObject
  3. Técnica moderna: https://developer.mozilla.org/en-US/docs/Web/API/MediaStream

9

Eu tive o mesmo erro para o MediaStream. A solução é configurada como um fluxo para o srcObject.

Dos documentos :

Importante: Se você ainda possui um código que se baseia em createObjectURL () para anexar fluxos a elementos de mídia, é necessário atualizar seu código para simplesmente configurar srcObject no MediaStream diretamente.



3

O problema é que as chaves fornecidas no loop não se referem ao índice do arquivo.

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

A saída do código acima é:

0
length
item

Mas o que era esperado era:

0
1
2
etc...

O erro ocorre quando o navegador tenta executar, por exemplo:

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

Sugiro a implementação com base no seguinte código:

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

Espero que isso possa ajudar alguém.

Saudações!


1

Se você estiver usando ajax, é possível adicionar as opções xhrFields: { responseType: 'blob' }:

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.