如何在点击下载文件之前验证预签名 url?

How to validate the presigned url before hitting it to download the file?

我在 AWS S3 存储桶中有一个文件。从 React 应用程序中,我生成了预先签名的 url 以将其下载给用户。 我没有使用 fetch()、axios.get() 或 https.get(),因为我不想将文件内容保存在内存中,因为我们可能需要同时处理许多此类请求而且文件大小也可能很大

所以我们决定使用 window.location = presignedurl 以便用户感觉文件是从同一页面下载的。 这对于成功下载来说工作正常。但是当预签名 url 出现问题时,例如 nosuchkeytimedoutsignaturedoesnotmatch 错误。这些错误在 UI 处抛出,并且无法捕获此类错误,因为我们的代码不在范围内。

所以我决定在隐藏的 iframe 中执行此操作,这样每当出现错误时,该错误将仅出现在隐藏的 iframe 中,用户将看不到它。但是为了捕获该错误并将其记录下来,我尝试从父框架访问它。我知道出于安全原因这是不可能的。所以我尝试从 iframe 内部 window.postMessage() 将内容传递给父级。

但问题是,当我使用 document.createElement('iframe') 动态生成此 iframe 并将 iframe 的 onload 函数定义为 iframe.onload = function() {} 时,我无法从中获取内容。每当我再次使用 iframe.contentDocument || iframe.contentWindow.document 时,我都会遇到跨域问题。

有没有办法获取错误信息?比如,有没有办法在从客户端浏览器下载文件之前检查 url 文件是否有效?

这里有两个选项供您选择:

  1. 在后端,使用 axios.head() 可以访问 URL 并消除您列出的大部分错误。然后在客户端使用 axios.get() 用于客户端会更安全。它不会消除所有错误,但会大大减少它们。
  2. 不是将整个内容下载到后端服务器并将其保存在内存中,而是使用流将内容从 S3 通过管道传输到客户端。这样,您只需要在任何给定点保留较小的内容部分。例如参见 [​​=10=].