Impossibile eseguire "createObjectURL" su "URL":


132

Visualizza l'errore sotto in Safari.

Impossibile eseguire "createObjectURL" su "URL": nessuna funzione trovata corrispondente alla firma fornita.

Il mio codice è:

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

Questo è il mio codice per l'immagine:

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
Ciao Hardik, cosa passi alla tua createObjectURL(...)funzione quando ricevi quell'errore ?
Arthur Weborg,

2
L'oggetto deve essere un oggetto File o BLOB per creare un URL oggetto per. vedi devdocs.io/dom/window.url.createobjecturl
yxf

1
Questo è il mio codice per l'immagine: funzione myUploadOnChangeFunction () {if (this.files.length) {for (var i in this.files) {if (this.files.hasOwnProperty (i)) {var src = createObjectURL (this. file [i]); var image = new Image (); image.src = src; imagSRC = src; $ ('# img'). attr ('src', src); }}}}
Hardik Mandankaa,

@HardikMansaraa Vai avanti e modificalo nella tua domanda.
soktinpk,

window.URL.createObjectURL('broken')genera un errore:Uncaught TypeError: Failed to execute 'createObjectURL' on 'URL': No function was found that matched the signature provided.
Juan Mendes,

Risposte:


150

AGGIORNARE

Considera di evitare il createObjectURL()metodo, mentre i browser lo stanno disabilitando. Basta collegare l' MediaStreamoggetto direttamente alla srcObjectproprietà di HTMLMediaElementesempio <video>element.

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

Tuttavia, se devi lavorare con MediaSource, Blobo File, devi creare un URL URL.createObjectURL()e assegnarlo a HTMLMediaElement.src.

Leggi maggiori dettagli qui: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/srcObject


Risposta precedente

Ho riscontrato lo stesso errore quando sono passato a createObjectURLdati non elaborati:

window.URL.createObjectURL(data)

Deve essere Blob, Fileo MediaSourceoggetto, non dati stessi. Questo ha funzionato per me:

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

Controlla anche l'MDN per maggiori informazioni: https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL


2
Ciao .. Cosa devo fare se ho a che fare con "application / pdf"? Ricevo lo stesso errore sulla console quando ho a che fare con un file PDF
N Sharma,

@mimo Sto usando lo stesso codice per scaricare il file. Ma vengono scaricati due file. Uno è il file corretto e un altro file con lo stesso nome ma lo stato non riuscito viene scaricato. Hai idea del perché stia succedendo?
Shardul,

Sono confuso con questo commento, in MDN scoraggia l'uso di URL.createObjectURL()flussi multimediali. Tuttavia non indica di NON usarlo per un input di file come indicato nella domanda iniziale.
alextrastero,

140

Questo errore è causato perché la funzione createObjectURLè obsoleta per Google Chrome

Ho cambiato questo:

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

a questa:

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

Questo ha funzionato per me.



createObjectURL non è obsoleto come mostrato qui, ma non accetta più l'oggetto flusso multimediale
goodies4uall

Questa dovrebbe essere la risposta.
DomingoR

c'è un altro problema video.play () sembra essere limitato: DOMException: play () può essere avviato solo da un gesto dell'utente.
user889030

@ user889030 significa che non puoi aprire una pagina web e aspettarti che inizi lo streaming della webcam. Devi consentire all'utente di avviare esplicitamente il flusso. Basta usare un pulsante per avviare lo streaming
S.Ramjit il

26

Il mio codice era rotto perché stavo usando una tecnica deprecata. Era questo:

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

Quindi l'ho sostituito con questo:

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

Funzionava magnificamente.

EDIT: recentemente localMediaStreamè stato deprecato e sostituito con MediaStream. L'ultimo codice è simile al seguente:

video.srcObject = MediaStream;

Riferimenti:

  1. Tecnica obsoleta: https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL
  2. Moderna tecnica deprecata: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/srcObject
  3. Tecnica moderna: https://developer.mozilla.org/en-US/docs/Web/API/MediaStream

9

Ho avuto lo stesso errore per MediaStream. La soluzione imposta un flusso su srcObject.

Dai documenti :

Importante: se si dispone ancora di codice che si basa su createObjectURL () per collegare flussi a elementi multimediali, è necessario aggiornare il codice per impostare semplicemente srcObject su MediaStream direttamente.



3

Il problema è che le chiavi fornite nel ciclo non si riferiscono all'indice del file.

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

L'output del codice sopra è:

0
length
item

Ma quello che ci si aspettava era:

0
1
2
etc...

Quindi l'errore si verifica quando il browser tenta di eseguire, ad esempio:

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

Suggerisco l'implementazione in base al seguente codice:

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

Spero che questo possa aiutare qualcuno.

Saluti!


2

Se si utilizza ajax, è possibile aggiungere le opzioni xhrFields: { responseType: 'blob' }:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.