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");