"URL" üzerinde "createObjectURL" yürütülemedi:


132

Safari'de aşağıdaki hatayı görüntüle.

'URL'de' createObjectURL 'yürütülemedi: Sağlanan imzayla eşleşen bir işlev bulunamadı.

Kodum:

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

Bu benim resim kodum:

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
Merhaba Hardik, createObjectURL(...)bu hatayı aldığınızda işlevinize ne iletiyorsunuz ?
Arthur Weborg

2
nesnenin bir nesne URL'si oluşturmak için bir File nesnesi veya Blob nesnesi olması gerekir. see devdocs.io/dom/window.url.createobjecturl
yxf

1
Bu benim kodum resim: function myUploadOnChangeFunction () {if (this.files.length) {for (var i in this.files) {if (this.files.hasOwnProperty (i)) {var src = createObjectURL (this. dosyaları [i]); var resim = yeni Resim (); image.src = src; imagSRC = src; $ ('# img']. attr ('src', src); }}}}
Hardik Mandankaa

@HardikMansaraa Devam edin ve bunu sorunuzda düzenleyin.
soktinpk

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

Yanıtlar:


150

GÜNCELLEME

createObjectURL()Tarayıcılar bunun için desteği devre dışı bırakırken yöntemden kaçınmayı düşünün . Sadece MediaStreamnesneyi örneğin element srcObjectözelliğine doğrudan iliştirin .HTMLMediaElement<video>

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

Ancak, çalışmak gerekiyorsa MediaSource, Blobya Filesen sahip bir URL oluşturmak zorunda, URL.createObjectURL()ve atamak HTMLMediaElement.src.

Daha fazla ayrıntıyı buradan okuyun: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/srcObject


Eski Cevap

createObjectURLHam verilere geçtiğimde de aynı hatayı yaşadım :

window.URL.createObjectURL(data)

Bu olmak zorundadır Blob, Fileya da MediaSourcenesne, veriyi barındırmaz. Bu benim için çalıştı:

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

Daha fazla bilgi için MDN'yi de kontrol edin: https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL


2
Merhaba .. "application / pdf" ile uğraşıyorsam ne yapmalıyım? PDF dosyasıyla uğraşırken konsolda aynı hatayı alıyorum
N Sharma

@mimo Dosyayı indirmek için aynı kodu kullanıyorum. Ancak iki dosya indiriliyor. Biri doğru dosya ve aynı ada sahip ancak başarısız olma durumuna sahip fazladan bir dosya indiriliyor. Neden olduğu hakkında bir fikriniz var mı?
Shardul

Bu yorumla kafam karıştı, MDN'de URL.createObjectURL()medya akışları için kullanımını caydırıyor. Ancak, ilk soruda belirtildiği gibi bir dosya girişi için KULLANILMAMASI gerektiğini belirtmez.
alextrastero

140

Bu hatanın nedeni, işlevin createObjectURLGoogle Chrome için kullanımdan kaldırılmasıdır

Ben bunu değiştirdim:

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

buna:

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

Bu benim için çalıştı.




Cevap bu olmalı.
DomingoR

başka bir sorun var video.play () kısıtlanmış görünüyor: DOMException: play () yalnızca bir kullanıcı hareketi ile başlatılabilir.
user889030

@ user889030 bu sadece bir web sayfasını açamayacağınız ve web kamerası akışının başlamasını bekleyemeyeceğiniz anlamına gelir. Kullanıcının akışı açıkça başlatmasına izin vermelisiniz.
Yayını

25

Kullanımdan kaldırılmış bir teknik kullandığım için kodum kırıldı. Eskiden şuydu:

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

Sonra bunu şununla değiştirdim:

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

Bu çok güzel çalıştı.

DÜZENLEME: Yakın localMediaStreamzamanda kullanımdan kaldırıldı ve ile değiştirildi MediaStream. En son kod şuna benzer:

video.srcObject = MediaStream;

Referanslar:

  1. Kullanımdan kaldırılan teknik: https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL
  2. Kullanımdan kaldırılmış modern teknik: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/srcObject
  3. Modern teknik: https://developer.mozilla.org/en-US/docs/Web/API/MediaStream

9

MediaStream için de aynı hatayı aldım. Çözüm, srcObject'e bir akış ayarlanır.

Gönderen docs :

Önemli: Akışları medya öğelerine eklemek için createObjectURL () yöntemine dayanan kodunuz hala varsa, srcObject öğesini doğrudan MediaStream'e ayarlamak için kodunuzu güncellemeniz gerekir.



3

Sorun, döngüde sağlanan anahtarların dosyanın dizinine atıfta bulunmamasıdır.

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

Yukarıdaki kodun çıktısı:

0
length
item

Ancak beklenen şuydu:

0
1
2
etc...

Ardından, tarayıcı yürütmeye çalıştığında hata oluşur, örneğin:

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

Aşağıdaki koda göre uygulamayı öneririm:

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

Umarım bu birine yardımcı olabilir.

Selamlar!


2

Ajax kullanıyorsanız, seçenekleri eklemek mümkündür xhrFields: { responseType: 'blob' }:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.