Не удалось выполнить createObjectURL для URL:


133

Отображать ошибку ниже в Safari.

Не удалось выполнить createObjectURL для URL-адреса: не найдено ни одной функции, соответствующей предоставленной подписи.

Мой код:

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
Привет, Хардик, что вы передаете своей createObjectURL(...)функции, когда получаете эту ошибку?
Артур Веборг

2
объект должен быть объектом File или объектом Blob для создания URL объекта. см. devdocs.io/dom/window.url.createobjecturl
yxf

1
Это мой код для изображения: function myUploadOnChangeFunction () {if (this.files.length) {for (var i in this.files) {if (this.files.hasOwnProperty (i)) {var src = createObjectURL (this. файлы [я]); var image = новое изображение (); image.src = src; imagSRC = src; $ ('# img'). attr ('src', src); }}}}
Hardik Mandankaa

@HardikMansaraa Отредактируйте это в своем вопросе.
soktinpk 05

window.URL.createObjectURL('broken')выдает ошибку:Uncaught TypeError: Failed to execute 'createObjectURL' on 'URL': No function was found that matched the signature provided.
Хуан Мендес

Ответы:


150

ОБНОВИТЬ

Рекомендуется избегать createObjectURL()метода, пока браузеры отключают его поддержку. Просто прикрепите MediaStreamобъект непосредственно к srcObjectсвойству, HTMLMediaElementнапример, <video>element.

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

Однако, если вам нужно работать с MediaSource, Blobили File, вам нужно создать URL-адрес URL.createObjectURL()и назначить егоHTMLMediaElement.src .

Подробнее читайте здесь: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/srcObject.


Старый ответ

У меня возникла такая же ошибка, когда я перешел к createObjectURLнеобработанным данным:

window.URL.createObjectURL(data)

Это должно быть Blob,File или 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 Я использую тот же код для загрузки файла. Но скачиваются два файла. Загружается один правильный файл и один дополнительный файл с тем же именем, но со статусом сбой. Вы хоть представляете, почему это происходит?
Shardul

Меня смущает этот комментарий, в MDN он не рекомендует использовать URL.createObjectURL()для медиапотоков. Однако в нем не говорится, что НЕ следует использовать его для ввода файла, как указано в начальном вопросе.
alextrastero

140

Эта ошибка вызвана тем, что функция createObjectURL не рекомендуется для Google Chrome.

Я изменил это:

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

к этому:

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

Это сработало для меня.


+1 См. Пример с
запасным вариантом

createObjectURL не является устаревшим, как показано здесь, но больше не принимает объект
медиапотока

Это должен быть ответ.
DomingoR

есть еще одна проблема: video.play () кажется ограниченным: DOMException: play () может быть инициирован только жестом пользователя.
user889030

@ user889030, это просто означает, что вы не можете открыть веб-страницу и ожидать запуска потока с веб-камеры. Вы должны позволить пользователю явно запускать поток. Просто используйте кнопку, чтобы запустить трансляцию
С.Рамджит

25

Мой код был сломан, потому что я использовал устаревшую технику. Раньше было так:

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

Затем я заменил это на это:

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

Это прекрасно сработало.

РЕДАКТИРОВАТЬ: недавно localMediaStreamустарел и заменен на MediaStream. Последний код выглядит так:

video.srcObject = new 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);
    ...
}

Надеюсь, это кому-то поможет.

Приветствую!


2

Если вы используете 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);
  }
});

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.