使用post请求获取的视频文件流,js如何转成视频文件并下载?
思否 问答 已采纳 👍 1 含 AI 优化版
问题
使用post请求获取的视频文件流,js如何转成视频文件并下载?
由大模型辅助整理,保留原意,优化结构与可读性。
问题概述
后端通过 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- 请求时设置
responseType: 'blob',在 Ajax 回调里直接拿到Blob对象; - 用
URL.createObjectURL(blob)生成一个临时的 blob URL; - 创建一个
<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