视频和字幕·直接媒体下载器
浏览器如何使用 fetch 和 Blob 从直接链接下载文件
· 工作原理
下载 浏览器 API 科尔斯
遍历浏览器工具用于将直接链接转换为已保存文件的管道:获取字节,将它们保存为 Blob,然后将它们传递给下载属性。解释为什么任何步骤都不需要服务器。
该链接会打开播放器而不是保存文件 - 单击直接 MP4 或 MP3 链接通常会内联播放,这是下载器解决的问题
单击直接 MP3 链接可能会打开播放器,因为浏览器知道如何播放该 MIME 类型。保存相同的字节是一个单独的操作。关键词是直接的:指向实际文件响应的链接,而不是包含播放器或列出媒体片段的清单的网页。 ToolAcre 在提供下载之前进行此区分,并且不会假装页面 URL 是文件 URL。
第一步: fetch() 向主机询问字节——对所宣布的主机的 GET 请求是什么样的以及返回什么
选择“检查链接”后,浏览器可能会向您提供的 URL 发出 HEAD 请求,以检查状态、类型和长度。获取文件使用对该主机的 GET 请求,而不是 ToolAcre 代理。该请求故意省略凭据,因此需要您登录的主机可能会拒绝它。远程服务器还必须允许跨域脚本读取;如果 CORS 阻止访问,该工具会解释拒绝情况,而不是通过隐藏的中继来绕过它。重定向可以更改目的地,因此请检查公布的主机。
第二步:响应正文变成 Blob — 如何在内存中收集字节以及 Blob 为何携带 MIME 类型
响应主体被读取为字节块流。当主机公开它时,Progress可以使用Content-Length;如果没有已知的长度,该工具可以显示收到的字节数,但不能显示可靠的百分比。它在收集块时强制执行内存上限,然后使用返回的内容类型组装 Blob。这比在无限流上调用response.blob()更安全,但它不是零内存流到磁盘:完成的Blob仍然占用浏览器会话中的空间。
第三步:URL.createObjectURL 和下载属性 — 临时 blob: URL 加上锚点如何触发保存对话框
Blob 是内存中的数据,而不是 Internet 地址。浏览器可以创建一个临时的 blob:object URL 并将其附加到带有下载文件名的锚点;单击该锚点会要求浏览器保存字节。文件名可能来自 Content-Disposition 标头或 URL 路径,而不是来自页面标题。由于该链接现在是同页 Blob URL,因此浏览器可以保存结果,而无需将其托管在 ToolAcre 上。在从不熟悉的来源打开文件之前检查扩展名和 MIME 类型仍然是明智的做法。
工作示例:从其附件链接保存播客剧集 - 将一个 MP3 从粘贴的 URL 保存到磁盘上的文件
想象一下,一个播客发布商公开了一个以 Episode.mp3 结尾的授权附件 URL。粘贴确切的地址,检查公布的主机并使用检查链接。如果允许 HEAD,它可能会显示音频/mpeg 和预期的字节数;然后 Fetch 向发布者请求 MP3 字节,将它们流式传输到 Blob 中并保存 Episode.mp3。如果主机省略 CORS 标头,浏览器可以在自己的选项卡中播放该链接,而该页面无法通过脚本获取该链接; “链接另存为”可能是正确的路线。用户保存文件的权利与其服务器在技术上是否允许获取该文件是分开的。
清理:撤销对象 URL 并释放内存 - 为什么构建良好的下载器会在保存完成后释放 Blob
临时对象 URL 保留对其支持 Blob 的引用。让每个 URL 保持活动状态的下载程序可以将大文件保留在长期存在的选项卡中。 ToolAcre 的共享下载实用程序为保存操作创建本地 URL,并在完成后撤销它;取消释放响应读取器并丢弃部分块。对于非常大的文件,从主机下载普通浏览器比在页面内存中收集整个响应更合适。
这不包括页面 URL、流媒体清单、DRM 和需要登录的链接
此工具不会找到隐藏在视频页面后面的媒体、解析 HLS/DASH .m3u8 或 .mpd 清单、绕过 DRM、欺骗标头或访问受会话保护的流。它不会为您下载私有内容,也不会决定许可证是否授予复制文件的权限。 403、登录页面重定向或 CORS 错误是需要理解的边界,而不是搜索未记录代理的提示。
要点:三个浏览器 API,无服务器 — Direct Media Downloader 如何将此管道应用于您粘贴的链接
管道从提供的主机获取 → 接收块 → 创建 Blob → 触发本地下载。不涉及ToolAcre中继,但绝对涉及对第三方主机的真实请求;它的日志可以看到连接。 Direct Media Downloader 在进行联系之前会宣布该联系,并在浏览器安全规则拒绝跨源读取时告诉您。