Конвертировать BLOB-URL в обычный URL

Моя страница генерирует URL-адрес примерно так: "blob:http%3A//localhost%3A8383/568233a1-8b13-48b3-84d5-cca045ae384f" Как я могу преобразовать его в обычный адрес?

Я использую это как <img>"s src приписывать.

7 ответов

Решение

URL, который был создан из JavaScript Blob не может быть преобразован в "нормальный" URL.

blob: URL-адрес не относится к данным, существующим на сервере, он относится к данным, которые ваш браузер в данный момент хранит в памяти, для текущей страницы. Он не будет доступен на других страницах, он не будет доступен в других браузерах и не будет доступен с других компьютеров.

Следовательно, в общем случае нет смысла преобразовывать Blob URL на "нормальный" URL. Если вы хотите получить обычный URL-адрес, вам придется отправить данные из браузера на сервер, и сервер сделает их доступными как обычный файл.

Можно конвертировать blob: URL в data: URL, по крайней мере, в Chrome. Вы можете использовать AJAX-запрос для "извлечения" данных из blob: URL (даже если он просто извлекает его из памяти вашего браузера, а не выполняет HTTP-запрос).

Вот пример:

var blob = new Blob(["Hello, world!"], { type: 'text/plain' });
var blobUrl = URL.createObjectURL(blob);

var xhr = new XMLHttpRequest;
xhr.responseType = 'blob';

xhr.onload = function() {
   var recoveredBlob = xhr.response;

   var reader = new FileReader;

   reader.onload = function() {
     var blobAsDataUrl = reader.result;
     window.location = blobAsDataUrl;
   };

   reader.readAsDataURL(recoveredBlob);
};

xhr.open('GET', blobUrl);
xhr.send();

data: URL, вероятно, не то, что вы подразумеваете под "нормальным" и могут быть проблематично большими. Однако они работают как обычные URL в том смысле, что ими можно делиться; они не являются специфичными для текущего браузера или сеанса.

Другой способ создать URL-адрес данных из URL-адреса BLOB-объекта - использовать canvas.

var canvas = document.createElement("canvas")
var context = canvas.getContext("2d")
context.drawImage(img, 0, 0) // i assume that img.src is your blob url
var dataurl = canvas.toDataURL("your prefer type", your prefer quality)

как я видел в mdn, canvas.toDataURL хорошо поддерживается браузерами. (кроме т. е.<9, всегда т. е. <9)

Для тех, кто пришел сюда в поисках способа загрузить видео / аудио с URL-адресом blob, этот ответ сработал для меня. Короче говоря, вам нужно будет найти файл *.m3u8 на желаемой веб-странице через вкладку Chrome -> Network и вставить его в проигрыватель VLC.

В другом руководстве показано, как сохранить поток с помощью VLC Player.

Нашел здесь этот ответ и хотел сослаться на него, поскольку он выглядит намного чище, чем принятый ответ:

function blobToDataURL(blob, callback) {
  var fileReader = new FileReader();
  fileReader.onload = function(e) {callback(e.target.result);}
  fileReader.readAsDataURL(blob);
}

Я очень опаздываю на вечеринку.

Если вы хотите загрузить контент, вы можете просто использовать fetch сейчас

      fetch(blobURL)
  .then(res => res.blob())
  .then(blob => /*do what you want with the blob here*/)

Вот решение:

              let blob = new Blob(chunks, { 'type' : 'video/mp4;' });
        let videoURL = window.URL.createObjectURL(blob);
        const blobF = await fetch(videoURL).then(res => res.blob())

Как говорилось в предыдущем ответе, невозможно декодировать его обратно в URL-адрес, даже если вы попытаетесь увидеть его на панели Chrome Devtools, URL-адрес все еще может быть закодирован как BLOB-объект.

Однако можно получить данные, другой способ получить данные - поместить их в якорь и напрямую загрузить.

<a href="blob:http://example.com/xxxx-xxxx-xxxx-xxxx" download>download</a>

Вставьте это на страницу, содержащую URL-адрес блоба и нажмите кнопку, вы получите контент.

Другой способ - перехватить вызов ajax через прокси-сервер, после чего вы можете просмотреть истинный URL-адрес изображения.

Другие вопросы по тегам