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.