将Blob URL转换为普通URL


95

我的页面会生成这样的URL:"blob:http%3A//localhost%3A8383/568233a1-8b13-48b3-84d5-cca045ae384f"如何将其转换为普通地址?

我将其用作<img>src属性。


1
即使在解码URL之后,它仍然是一个localhost链接。改为查找其公共链接。(您使用的是哪个CDN?)
Raptor

我希望使用javascript。
2013年

使用stackvoverflow链接 ..和W3C您真正的问题是如何使其独立于在其中部署代码的环境
user1428716 2013年

有没有一种方法可以从Blob地址中找到公共URL。这是我唯一的价值。
2013年

Answers:


162

从JavaScript创建的URL Blob不能转换为“普通” URL。

一个blob:URL并不是指在服务器上存在的数据,它是指数据您的浏览器目前在存储器中,当前页面。它在其他页面上将不可用,在其他浏览器中将不可用,并且在其他计算机上将不可用。

因此,通常来说,将BlobURL 转换为“正常” URL 是没有意义的。如果要使用普通URL,则必须将数据从浏览器发送到服务器,并使服务器像普通文件一样使它可用。

至少在Chrome中,可以将blob:网址转换为data:网址。您可以使用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
如果Blob网址未指向服务器数据,那么Youtube视频的src网址将如下所示:src =“ blob:https%3A // www.youtube.com / 44f26667-03f1-4978-9eed-af0cbf11dd67”(在Chrome)
bhh1988'9

5
@ bhh1988这是一个非常有趣的发现。我不确定那里发生了什么。如果我尝试使用XMLHttpRequest检索其src blob URL,如本文所述,则不会返回任何内容。我的猜测是,要么(a)他们生成了任何空的Blob URL,同时又从另一个来源获取数据,要么(b)Blob以某种方式充当了加密数据的代理(通过HTML5加密媒体扩展名)。但是,我不确定在实践中如何实际完成这两个操作。
杰里米2014年

19
@ bhh1988 媒体源扩展规范似乎允许为由JavaScript管理的媒体流创建blob URL。这些不对应静态数据(如本文中讨论的Blob URL),因此行为不同,但它们仍引用本地信息,而不是直接引用服务器上的数据。
杰里米(Jeremy)

1
嗯,听起来不错。这很令人困惑,因为url看起来真实且专心,但是如果它只是一个占位符,那么src的值是什么都不要紧。
bhh1988 2014年

3
我得到一个Not allowed to navigate top frame to data URL: data:text/plain;base64,...错误。我得到了数据,但是window.location这是不允许的...
loretoparisi 18-4-24的

15

从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。(除了ie <9,总是ie <9)


17
请注意,这当然仅适用于图像数据,并且某些元数据可能会丢失!
minmaxavg

1
这样做会创建一个链接,但是如果您遵循它,您只会得到一个黑框。
Antfish

@Antfish,这不应该发生,不是吗?
Pacerier '17

5

对于那些来这里寻找下载Blob网址视频/音频的人来说,这个答案对我有用。简而言之,您需要通过Chrome- > 网络标签在所需的网页上找到* .m3u8文件,并将其粘贴到VLC播放器中

另一指南介绍了如何使用VLC Player保存流


-5

正如前面的回答所说,即使您尝试从chrome devtools面板中看到它,也无法将其解码回url,但该url仍可能被编码为blob。

但是,可以获取数据,获取数据的另一种方法是将其放入锚点并直接下载。

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

将其插入包含Blob网址的页面,然后单击按钮,您将获得内容。

另一种方法是通过代理服务器拦截ajax调用,然后您可以查看真实的图像URL。


<a href="blob: example.com/xxxx-xxxx-xxxx-xxxx“download="abc.txt">下载</a>。它应该工作。当将达到HREF,将重命名的blob的abc.txt和下载
P萨蒂什Patro

1
为什么要下票?你真的试过我说的吗?
ospider

我还没有投票。我来了 而且,我认为它会起作用。我是支持这个littlebit的
P萨蒂什Patro
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.