Chuyển đổi URL blob thành URL bình thường


95

Trang của tôi tạo ra một URL như thế này: "blob:http%3A//localhost%3A8383/568233a1-8b13-48b3-84d5-cca045ae384f"Làm cách nào để chuyển đổi nó thành một địa chỉ bình thường?

Tôi đang sử dụng nó như là một <img>'s srcthuộc tính.


1
ngay cả sau khi giải mã URL, nó vẫn là một localhostliên kết. Tìm liên kết công khai của nó để thay thế. (bạn đang sử dụng CDN nào?)
Raptor

Tôi đang muốn sử dụng javascript.
Jacob,

Sử dụng các liên kết stackvoverflow .. và W3C vấn đề thực sự của bạn sẽ làm thế nào để làm cho nó không phụ thuộc vào môi trường bạn triển khai mã của bạn trong
user1428716

Có cách nào để tìm URL công khai từ địa chỉ blob không. Đây là giá trị duy nhất tôi có.
Jacob

Câu trả lời:


162

BlobKhông thể chuyển đổi URL được tạo từ JavaScript thành URL "bình thường".

Một blob:URL không đề cập đến dữ liệu tồn tại trên máy chủ, nó đề cập đến dữ liệu mà trình duyệt của bạn hiện có trong bộ nhớ, cho trang hiện tại. Nó sẽ không có sẵn trên các trang khác, nó sẽ không khả dụng trong các trình duyệt khác và nó sẽ không khả dụng trên các máy tính khác.

Do đó, nói chung, không có ý nghĩa gì khi chuyển đổi một BlobURL thành một URL "bình thường". Nếu bạn muốn có một URL thông thường, bạn sẽ phải gửi dữ liệu từ trình duyệt đến một máy chủ và để máy chủ cung cấp nó như một tệp thông thường.

Có thể chuyển đổi một blob:URL thành một data:URL, ít nhất là trong Chrome. Bạn có thể sử dụng một yêu cầu AJAX để "tìm nạp" dữ liệu từ blob:URL (mặc dù nó thực sự chỉ kéo nó ra khỏi bộ nhớ của trình duyệt của bạn, không thực hiện một yêu cầu HTTP).

Đây là một ví dụ:

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 có thể không giống như ý bạn muốn nói là "bình thường" và có thể lớn có vấn đề. Tuy nhiên, chúng hoạt động giống như các URL bình thường ở chỗ chúng có thể được chia sẻ; chúng không dành riêng cho trình duyệt hoặc phiên hiện tại.


14
Nếu url blob không trỏ đến dữ liệu máy chủ thì tại sao url src của video trên Youtube trông giống như sau: src = "blob: https% 3A // www.youtube.com / 44f26667-03f1-4978-9eed-af0cbf11dd67" (trong Chrome)
bhh1988

5
@ bhh1988 Đó là một phát hiện rất thú vị. Tôi không chắc chuyện gì đang xảy ra ở đó. Nếu tôi cố gắng truy xuất URL src blob của họ bằng cách sử dụng XMLHttpRequest, như được mô tả trong bài đăng này, không có nội dung nào được trả lại. Tôi đoán là (a) họ đã tạo bất kỳ URL Blob trống nào để sử dụng làm trình giữ chỗ trong khi cấp dữ liệu từ một nguồn khác hoặc (b) Blob bằng cách nào đó hoạt động như một proxy cho dữ liệu được mã hóa (thông qua Tiện ích mở rộng phương tiện được mã hóa HTML5). Tuy nhiên, tôi không chắc làm thế nào một trong hai điều này thực sự có thể được thực hiện trong thực tế.
Black Lives Matter,

19
@ bhh1988 Có vẻ như thông số kỹ thuật của phần mở rộng nguồn phương tiện cho phép tạo các URL blob cho các luồng phương tiện đang được JavaScript quản lý. Chúng không tương ứng với dữ liệu tĩnh như các URL blob được thảo luận trong bài đăng này, do đó có sự khác biệt về hành vi, nhưng chúng vẫn đề cập đến thông tin cục bộ, không trực tiếp đến dữ liệu trên máy chủ.
Black Lives Matter,

1
Hmm, nghe có vẻ đúng. Thật khó hiểu vì url trông thật và có mục đích, nhưng nếu nó chỉ là một trình giữ chỗ thì không quan trọng giá trị của src là gì.
bhh1988

3
Tôi nhận được một Not allowed to navigate top frame to data URL: data:text/plain;base64,...lỗi. Tôi nhận được dữ liệu, nhưng window.locationnó không được phép ...
loretoparisi

15

một cách khác để tạo url dữ liệu từ url blob có thể là sử dụng 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)

như những gì tôi thấy trong mdn, canvas.toDataURL được trình duyệt hỗ trợ tốt. (ngoại trừ tức là <9, luôn luôn tức là <9)


17
Lưu ý rằng điều này tất nhiên chỉ áp dụng cho dữ liệu hình ảnh và một số siêu dữ liệu có thể bị mất!
minmaxavg

1
Làm điều này sẽ tạo ra một liên kết nhưng nếu bạn làm theo nó, bạn chỉ nhận được một hộp đen.
Antfish

@Antfish, Điều đó không nên xảy ra phải không?
Pacerier

5

Đối với những người đến đây để tìm cách tải xuống video / âm thanh url blog, câu trả lời này phù hợp với tôi. Tóm lại, bạn cần tìm tệp * .m3u8 trên trang web mong muốn thông qua tab Chrome -> Mạng và dán nó vào trình phát VLC .

Một hướng dẫn khác chỉ cho bạn cách lưu luồng bằng VLC Player .


-5

Như câu trả lời trước đã nói, không có cách nào để giải mã nó trở lại url, ngay cả khi bạn cố gắng xem nó từ bảng chrome devtools, url có thể vẫn được mã hóa dưới dạng blob.

Tuy nhiên, có thể lấy dữ liệu, một cách khác để lấy dữ liệu là đặt nó vào một mỏ neo và trực tiếp tải xuống.

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

Chèn cái này vào trang chứa url blob và nhấp vào nút, bạn sẽ có được nội dung.

Một cách khác là chặn cuộc gọi ajax thông qua máy chủ proxy, sau đó bạn có thể xem url hình ảnh thực.


<a href="blob: example.com/xxxx-xxxx-xxxx-xxxx "download="abc.txt"> tải xuống </a>. Nó sẽ hoạt động. Khi nó sẽ nhấn href, nó sẽ đổi tên blob để abc.txt & tải
P Satish Patro

1
Tại sao lại phản đối? bạn đã thực sự thử những gì tôi nói chưa?
ospider

Tôi đã không phản đối. Tôi đến đây. Và, tôi nghĩ nó sẽ hoạt động. Tôi ủng hộ điều này một chút
P Satish Patro
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.