使用post请求获取的视频文件流,js如何转成视频文件并下载?

思否 问答 已采纳 👍 1 含 AI 优化版

问题

使用post请求获取的视频文件流,js如何转成视频文件并下载?

在 SegmentFault 查看原问题 →

由大模型辅助整理,保留原意,优化结构与可读性。

问题概述

后端通过 POST 请求返回视频文件流,前端希望用 JS 将其转换为可下载的视频文件,需要一个兼顾移动端和后台下载的完整方案。

涉及技术(如有)

  • Ajax/XHR responseType: 'blob'
  • URL.createObjectURL
  • <a download> 属性
  • <form target> 触发下载
  • 临时授权 URL

期望结果

得到一个安全、支持移动端、支持后台下载的文件下载实现方案。

回答

原始回答

使用 responseData: 'blob' 这样可以在 ajax 的回调里面就收到 blob,然后用 URL.createObjectURL 转为 bloburl,放在 a 标签用 download 属性触发下载。但是这个的缺点就是不支持移动端,且不支持后台下载需要页面一直开着所以一般我们会直接通过 form target 来触发浏览器的默认下载来下载资源。这种方案的缺点是不能携带 headers。所以这里一般会改成临时授权 url 来解决。这样就能实现一个安全的,支持移动端的,支持后台下载的下载功能。

AI 优化 · 回答整理

解答思路

先了解两种常见方案各自的优缺点,再结合临时授权 URL 弥补它们的短板,最终得到一个兼顾安全性、移动端兼容性和后台下载能力的方案。

详细说明

  • 方案一:Blob + createObjectURL
    1. 请求时设置 responseType: 'blob',在 Ajax 回调里直接拿到 Blob 对象;
    2. URL.createObjectURL(blob) 生成一个临时的 blob URL;
    3. 创建一个 <a> 标签,设置 href 为该 blob URL,并设置 download 属性触发浏览器下载。
    • 缺点:不支持移动端(部分移动浏览器对 blob URL 下载支持不佳),且必须保持页面一直打开才能完成下载,不支持真正的后台下载。
  • 方案二:<form target> 触发浏览器默认下载
    • 直接构造一个表单并提交(或跳转到下载地址),利用浏览器原生的下载能力,天然支持移动端和后台下载。
    • 缺点:无法携带自定义请求头(headers),因此不能直接用于需要鉴权 header 的接口。
  • 解决 headers 限制:改用临时授权 URL
    • 后端提供一个接口,先用正常的鉴权请求(可带 headers)换取一个临时授权下载链接(通常带有效期短的 token 作为 URL 参数);
    • 前端拿到这个临时 URL 后,直接通过方案二(<form target> 或跳转)下载,因为鉴权信息已经内嵌在 URL 中,不再需要 headers。

小结

纯前端 Blob 方案适合桌面端、页面常驻的场景,但移动端兼容性和后台下载能力不足;改用 <form target> + 临时授权 URL 的组合方案,既能绕开无法携带 headers 的限制,又能获得移动端友好、支持后台下载的完整下载体验,是更通用的做法。

由大模型辅助整理,保留原意,补充结构与代码格式。

回答转载自 SegmentFault

评论

评论功能即将开放。你也可以通过 邮件GitHub Issue 反馈。