Javascript 允许用户在生成URL时下载文件的正确方法
情况:Javascript 允许用户在生成URL时下载文件的正确方法,javascript,html,amazon-s3,Javascript,Html,Amazon S3,情况: 文件位于AWS S3上 用户按下按钮下载文件 请求被发送到服务器 响应服务器发送生成的URL,该URL授予对文件的访问权 当然,URL链接到另一个域(S3 bucket) 当前解决方案: 现在JS处理程序将窗口的位置更改为接收到的URL 文件按其应有的方式下载 但浏览器会抛出如下错误: Chrome:“资源解释为文档,但使用MIME类型应用程序/八位字节流传输” Safari:“加载资源失败:帧加载中断” 我不能用简单的替换按钮,因为URL是根据用户的请求生成的,并且事先
- 文件位于AWS S3上
- 用户按下按钮下载文件
- 请求被发送到服务器
- 响应服务器发送生成的URL,该URL授予对文件的访问权
- 当然,URL链接到另一个域(S3 bucket)
- 现在JS处理程序将窗口的位置更改为接收到的URL
- 文件按其应有的方式下载
- 但浏览器会抛出如下错误:
- Chrome:“资源解释为文档,但使用MIME类型应用程序/八位字节流传输”
- Safari:“加载资源失败:帧加载中断”
替换按钮,因为URL是根据用户的请求生成的,并且事先不知道
我希望它是一键式的体验(即,我不希望用户用收到的URL单击新按钮)
问题:
- 在生成文件URL时,允许用户下载文件的正确方式是什么
- 是否可以为此更改
窗口位置
窗口位置听起来不对
如果您使用
正确的方法是让后端发送正确的内容类型
头,并在链接下载请求中提供正确的MIME文件类型
可以更改window.location
或document.location.href
以将页面重定向到下载链接。这实际上是一个非常简单的问题,根本不需要Javascript
当请求通过简单地单击链接发送到服务器时,服务器--在验证请求后,生成一个签名的URL,然后响应
HTTP/1.1 302 Found
Location: https://example-bucket.s3.amazonaws.com/... # new signed URL
浏览器遵循重定向并获取资源。
- 如果您可以对收到的URL(下载URL)执行获取请求:
只需打开一个新选项卡:
window.open(downloadUrl, "_blank");
这样,浏览器开始下载文件,然后新选项卡将自动关闭
- 如果您有义务执行POST下载URL请求:
临时将隐藏表单插入当前页面,然后提交:
var form=$(“”
+ ''
+ '');
格式附录(文件正文);
$(表单).submit();
form.remove()代码>
HTTP/1.1 302 Found
Location: https://example-bucket.s3.amazonaws.com/... # new signed URL
window.open(downloadUrl, "_blank");