将 Blob URL 转换为普通 URL

IT技术 javascript url blob
2021-01-21 16:13:44

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

我将它用作<img>'ssrc属性。

6个回答

从 JavaScript 创建的 URLBlob无法转换为“普通” URL。

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

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

至少在 Chrome 中,可以将blob:URL 转换为data:URL。您可以使用 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 一样工作,因为它们可以共享;它们并非特定于当前浏览器或会话。

@bhh1988 看起来媒体源扩展规范允许为由 JavaScript 管理的媒体流创建 blob URL。这些不对应于本文中讨论的 blob URL 之类的静态数据,因此在行为上有所不同,但它们仍然引用本地信息,而不是直接引用服务器上的数据。
2021-03-12 16:13:44
我得到一个Not allowed to navigate top frame to data URL: data:text/plain;base64,...错误。我得到了数据,但window.location不允许...
2021-03-22 16:13:44
@bhh1988 这是一个非常有趣的发现。我不确定那里发生了什么。如果我尝试使用 XMLHttpRequest 检索他们的 src blob URL,如本文所述,不会返回任何内容。我的猜测是,要么 (a) 他们生成任何空的 Blob URL 以用作占位符,同时从另一个来源输入数据,或者 (b) Blob 以某种方式充当加密数据的代理(通过 HTML5 加密媒体扩展)。但是,我不确定如何在实践中实际完成这些中的任何一个。
2021-04-02 16:13:44
嗯,听起来不错。这很令人困惑,因为 url 看起来真实且有意,但如果它只是一个占位符,那么 src 的值是什么就不重要了。
2021-04-05 16:13:44
如果 blob url 不指向服务器数据,那么 Youtube 视频的 src url 怎么看起来像:src="blob:https%3A//www.youtube.com/44f26667-03f1-4978-9eed-af0cbf11dd67"(在铬合金)
2021-04-08 16:13:44

从 blob url 创建数据 url 的另一种方法可能是使用画布。

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)

这样做会创建一个链接,但如果您遵循它,您只会得到一个黑框。
2021-03-18 16:13:44
请注意,这当然仅适用于图像数据,并且可能会丢失一些元数据!
2021-03-31 16:13:44
@Antfish,这不应该发生,不是吗?
2021-04-11 16:13:44

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

另一个指南向您展示了如何使用 VLC 播放器保存流


更新:

从 blob url 下载视频的另一种方法是使用批量下载器并将文件连接在一起。

下载视频部分

  1. 在 Chrome 开发工具中打开网络选项卡

在此处输入图片说明

  1. 重新加载网页
  2. 过滤 .m3u8 文件

在此处输入图片说明

  1. 查看所有过滤的文件并找到“.ts”文件的播放列表。它应该是这样的:

在此处输入图片说明

  1. 您需要以某种方式提取这些链接。手动下载和编辑文件或使用您喜欢的任何其他方法。如您所见,这些链接非常相​​似,唯一不同的是视频的序列号:“s- 0 -v1-a1.ts”、“s- 1 -v1-a1.ts”等。

    https://some-website.net/del/8cf.m3u8/s-0-v1-a1.ts

    https://some-website.net/del/8cf.m3u8/s-1-v1-a1.ts

    https://some-website.net/del/8cf.m3u8/s-2-v1-a1.ts


依此类推,直到 .m3u8 播放列表文件中的最后一个链接。这些 .ts 文件实际上是您的视频。您需要下载所有这些。

  1. 对于批量下载,我更喜欢使用 Chrome 的 Simple Mass Downloader 扩展程序(https://chrome.google.com/webstore/detail/simple-mass-downloader/abdkkegmcbiomijcbdaodaflgehfffed

  2. 如果您选择使用 Simple Mass Downloader,则需要:

    一个。选择模式 URL

在此处输入图片说明

在地址字段中输入您的链接,只做一个修改:链接中为每个下一个视频更改的部分需要替换为方括号 [0:400] 中的模式,其中 0 是第一个文件名,400 是最后一个。所以你的链接应该看起来像这样https://some-website.net/del/8cf.m3u8/s-[0:400]-v1-a1.ts

然后点击导入按钮将这些链接添加到 Mass Downloader 的下载列表中。

在此处输入图片说明

C。下一个操作可能会询问您下载的每个视频的目标文件夹。因此,强烈建议在 Chrome 设置中指定默认下载文件夹,并在 Chrome 设置中禁用选择目标选项。这将为您节省很多时间!此外,您可能希望指定这些文件所在的文件夹:

在此处输入图片说明

C1. 单击“全选”复选框以从“下载列表”中选择所有文件。

在此处输入图片说明

C2. 单击 SMD 扩展窗口右下角的下载按钮。它将带您到下一个选项卡开始下载

在此处输入图片说明

C3. 选择点击开始。这将自动将所有视频下载到下载文件夹中。

在此处输入图片说明

这就对了!只需等待所有文件下载完毕,您就可以通过 VLC 播放器或任何其他支持 .ts 格式的播放器观看它们。但是,如果您想拥有一个视频而不是已下载的视频,则需要将所有这些迷你视频连接在一起

加入影片部分

由于我在 Mac 上工作,因此我不知道您将如何在 Windows 上执行此操作。如果您是 Windows 用户并且想要合并视频,请随时谷歌搜索 Windows 解决方案。后续步骤仅适用于 Mac。

  1. 在要保存新视频的文件夹中打开终端
  2. 类型:cat并点击space
  3. 打开您下载.ts视频的文件夹选择.ts您要加入的所有视频(使用鼠标或cmd+A
  4. 将它们拖放到终端中
  5. space
  6. >
  7. Space
  8. 输入新视频的名称,例如my_new_video.ts请注意,格式必须与原始视频中的格式相同,否则转换时间会很长,甚至可能会失败!
  9. 击中Enter等待终端完成加入过程并享受观看您的视频!
这项工作ED ......直到聪明的HTML / JS大师开始避免*.m3u8完全。无赖!
2021-03-14 16:13:44

在这里找到了这个答案并想参考它,因为它看起来比接受的答案要干净得多:

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*/)
@GwynethLlewelyn 您找到任何解决方案了吗?
2021-03-24 16:13:44
我一直在尝试使用您的代码(从stackoverflow.com/a/58021822/1035977获得一些灵感),但显然fetch() 无法获得blob:https://example.com/123e4567-e89b-12d3-a456-426614174000URL。我正在进一步调查...
2021-03-28 16:13:44