「URL」で「createObjectURL」を実行できませんでした:


132

Safariで以下のエラーを表示します。

「URL」で「createObjectURL」を実行できませんでした:指定された署名に一致する関数が見つかりませんでした。

私のコードは:

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

これは私の画像のコードです:

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
こんにちはHardik、createObjectURL(...)エラーが発生したときに関数に何を渡していますか?
Arthur Weborg 2014年

2
オブジェクトは、オブジェクトURLを作成するためにFileオブジェクトまたはBlobオブジェクトである必要があります。devdocs.io / dom
window.url.createobjecturlを

1
これは画像のコードです:function myUploadOnChangeFunction(){if(this.files.length){for(var i in this.files){if(this.files.hasOwnProperty(i)){var src = createObjectURL(this。ファイル[i]); var image = new Image(); image.src = src; imagSRC = src; $( '#img')。attr( 'src'、src); }}}}
Hardik Mandankaa 2014年

@HardikMansaraaさあ、それをあなたの質問に編集してください。
soktinpk 2014

window.URL.createObjectURL('broken')エラーをスローします:Uncaught TypeError: Failed to execute 'createObjectURL' on 'URL': No function was found that matched the signature provided.
Juan Mendes

回答:


150

更新

createObjectURL()ブラウザーがそのサポートを無効にしている間は、メソッドを回避することを検討してください。たとえば、要素MediaStreamsrcObjectプロパティにオブジェクトを直接アタッチするだけです。HTMLMediaElement<video>

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

しかし、あなたが作業する必要がある場合MediaSourceBlobまたはFile、あなたがURLを作成する必要がありますURL.createObjectURL()し、それを割り当てますHTMLMediaElement.src

詳細については、こちらをご覧くださいhttps : //developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/srcObject


古い回答

createObjectURL生データに渡したときに同じエラーが発生しました:

window.URL.createObjectURL(data)

それはなければならないBlobFileまたはMediaSourceオブジェクトではなく、データそのもの。これは私のために働きました:

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

詳細についてはMDNも確認してください:https : //developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL


2
こんにちは。「application / pdf」を扱っている場合はどうすればよいですか?PDFファイルを処理しているときにコンソールで同じエラーが発生します
N Sharma

@mimo同じコードを使用してファイルをダウンロードしています。しかし、2つのファイルがダウンロードされています。1つは正しいファイルで、もう1つは同じ名前の追加ファイルですが、失敗したステータスがダウンロードされます。それがなぜ起こっているのかあなたは何か考えがありますか?
Shardul

私はこのコメントと混同しています。MDNではURL.createObjectURL()、メディアストリームの使用を推奨していません。ただし、最初の質問で述べたように、ファイル入力に使用しないことは明記されていません。
alextrastero

140

このエラーは、関数createObjectURLがGoogle Chromeで非推奨であるために発生します

私はこれを変更しました:

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

これに:

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

これでうまくいきました。


+1フォールバックを使用した例を参照developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/…–
eddyparkinson

createObjectURLは、ここに示すように非推奨ではありませんが、メディアストリームオブジェクトを受け入れなくなりました
goodies4uall

これが答えになるはずです。
DomingoR

別の問題があります。video.play()は制限されているようです:DOMException:play()はユーザーのジェスチャーによってのみ開始できます。
user889030

@ user889030は、ウェブページを開いて、ウェブカメラストリームの開始を期待できないことを意味します。ユーザーが明示的にストリームを開始できるようにする必要があります。ボタンを使用してストリーミングを開始するだけ
S.Ramjit

26

非推奨の手法を使用していたため、コードが壊れました。以前はこれでした:

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

それを私はこれに置き換えました:

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

それは美しく機能しました。

編集:最近localMediaStream非推奨になり、に置き換えられましたMediaStream。最新のコードは次のようになります。

video.srcObject = MediaStream;

参照:

  1. 非推奨の手法:https : //developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL
  2. 最新の推奨されない手法:https : //developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/srcObject
  3. 最新のテクニック:https : //developer.mozilla.org/en-US/docs/Web/API/MediaStream

9

MediaStreamでも同じエラーが発生しました。ソリューションは、srcObjectにストリームを設定します。

ドキュメントから:

重要:メディア要素にストリームをアタッチするためにcreateObjectURL()に依存するコードがまだある場合は、srcObjectを直接MediaStreamに設定するようにコードを更新する必要があります。



3

問題は、ループで提供されるキーがファイルのインデックスを参照しないことです。

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

上記のコードの出力は次のとおりです。

0
length
item

しかし、期待されていたのは:

0
1
2
etc...

次に、ブラウザが実行しようとすると、エラーが発生します。次に例を示します。

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

次のコードに基づいて実装を提案します。

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

これが誰かの役に立つことを願っています。

こんにちは!


1

ajaxを使用している場合は、オプションを追加できますxhrFields: { responseType: 'blob' }

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.