Перетворити BLOB-адресу на звичайну URL-адресу


95

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

Я використовую його в якості <img>«S srcатрибута.


1
навіть після декодування URL-адреси, це все одно localhostпосилання. Дізнайтеся його загальнодоступне посилання. (який CDN ви використовуєте?)
Raptor

Я бажаю використовувати javascript.
Яків

Використовуйте посилання stackvoverflow .. та W3C Вашою справжньою проблемою буде те, як зробити його незалежним від середовища, в якому ви розгортаєте свій код
user1428716

Чи є спосіб знайти загальнодоступну URL-адресу з адреси BLOB. Це єдине значення, яке я маю.
Яків

Відповіді:


162

URL-адресу, створену з JavaScript, Blobне можна перетворити на "звичайну" URL-адресу.

blob:URL не належить до даних на сервері існує, це відноситься до даних, ваш браузер в даний час має в пам'яті, для поточної сторінки. Він не буде доступний на інших сторінках, він не буде доступний в інших браузерах і не буде доступний з інших комп’ютерів.

Тому загалом немає сенсу перетворювати BlobURL-адресу в "звичайну" 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-адреси, оскільки ними можна ділитися; вони не стосуються поточного браузера чи сеансу.


14
Якщо URL-адреси BLOB-об'єктів не вказують на дані сервера, то як так виглядає URL-адреса URL-адреси відео YouTube: src = "blob: https% 3A // www.youtube.com / 44f26667-03f1-4978-9eed-af0cbf11dd67" (у Chrome)
bhh1988

5
@ bhh1988 Це дуже цікава знахідка. Я не впевнений, що там відбувається. Якщо я спробую отримати їхню URL-адресу BLOB-масиву за допомогою XMLHttpRequest, як описано в цій публікації, вміст не повертається. Я припускаю, що (а) вони створили будь-яку порожню URL-адресу Blob для використання як заповнювач під час подачі даних з іншого джерела, або (b) Blob якось діє як проксі-сервер для зашифрованих даних (через HTML5 Encrypted Media Extensions). Однак я не впевнений, як насправді будь-що з цього можна зробити на практиці.
Джеремі

19
@ bhh1988 Схоже, специфікація розширень джерел медіа дозволяє створювати URL-адреси BLOB для медіапотоків, якими керує JavaScript. Вони не відповідають статичним даним, таким як URL-адреси BLOB-об'єктів, про які йдеться в цій публікації, звідси різниця в поведінці, але вони все одно посилаються на локальну інформацію, а не безпосередньо на дані на сервері.
Jeremy

1
Хм, звучить правильно. Це бентежить, оскільки URL-адреса виглядає реальною та уважною, але якщо це просто заповнювач, не повинно мати значення, яке значення має src.
bhh1988

3
Я отримую Not allowed to navigate top frame to data URL: data:text/plain;base64,...помилку. Я отримую дані, але window.locationце заборонено ...
loretoparisi

15

іншим способом створення URL-адреси даних із URL-адреси BLOB може бути використання полотна.

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)


17
Зверніть увагу, що це, звичайно, стосується лише даних зображень, і деякі метадані можуть бути втрачені!
minmaxavg

1
Це створює посилання, але якщо ви переходите за ним, ви отримуєте лише чорний ящик.
Antfish

@Antfish, цього не повинно статися, чи не так?
Pacerier

5

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

Інший посібник показує, як зберегти потік за допомогою VLC Player .


-5

Як було сказано в попередній відповіді, немає можливості декодувати його назад до URL-адреси, навіть коли ви намагаєтесь побачити це з панелі chrome devtools, URL-адреса все ще може бути закодована як BLOB.

Однак отримати дані можна, ще один спосіб отримати дані - це покласти їх у якір і безпосередньо завантажити.

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

Вставте це на сторінку, що містить URL-адресу BLOB-об'єкта, і натисніть кнопку, щоб отримати вміст.

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


<a href="blob: example.com/xxxx-xxxx-xxxx-xxxx "download="abc.txt"> завантажити </a>. Це має спрацювати. Коли він потрапить у href, він перейменує BLOB в abc.txt і завантажить
P

1
Чому голоси проти? ти насправді пробував те, що я сказав?
ospider

Я не голосував проти. Я прийшов сюди. І, я думав, це спрацює. Я на підтримку цього
P
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.