axios 当签名URL具有域时,Google Cloud Storage上传大文件失败

k4emjkb1  于 2023-08-04  发布在  iOS
关注(0)|答案(1)|浏览(117)

我正在使用NodeJS生成一个签名的URL,以允许我的用户上传文件。
生成URL的代码非常简单,可以使用具有Google Cloud域的URL。
但是,我希望签名的URL具有我的自定义域,因此我生成的URL以https://example.com开头。

async function generateSignedUrl(file) {
  const bucketName = '<bucket-name>';
  const storage = new Storage({keyFilename: '<path-to-key>'});
  const options = {
    version: 'v4',
    action: 'write',
    expires: Date.now() + 15 * 60 * 1000, // 5 minutes
    contentType: 'application/octet-stream',
    cname: 'https://example.com'
  };

  const [url] = await storage
    .bucket(bucketName)
    .file(file)
    .getSignedUrl(options)
    .catch(error => console.log(error))

  return url
}

字符串
基础设施是这样的,桶被配置为负载均衡器的后端,所以我的DNS服务器具有负载均衡器IP,它将请求路由到负载均衡器。负载均衡器然后将请求路由到桶。
我尝试了一个简单的DNS重定向到Google Cloud URL,虽然重定向工作,但上传不工作,因为浏览器首先发送OPTIONS请求并导致OPTIONS request cannot be redirected错误。当请求从一个子域发送到另一个子域时,OPTIONS请求也被触发。例如,前端部署在https://staging.app.com,签名的URL以https://upload.staging.app.com开头,所以如果我理解正确,CORS在这里不是问题,DNS重定向根本不是一个选项?
问题是上传适用于小文件(< 5MB),但对于大文件,上传突然停止,然后在一段时间后失败,如Axios中的进度更新所示。负载平衡器日志显示client_timed_out错误,错误为408或504。我也试过使用CURL,但行为完全相同。
如果重要的话,这里是执行上传的Axios代码。

axios.put(
  url,
  file,
  {
    headers: {
      'content-type': 'application/octet-stream',
    },
    onUploadProgress(progressEvent) {
      console.log(`Upload Progress: ${JSON.stringify(progressEvent)}`)
    },
  }
)


我在过去的一个月里搜索了几个小时,但找不到一个资源来展示如何实现它。这似乎太好了,不可能是真的,但我觉得没有人试过。
只是需要注意的是,在没有基于CNAME的url的情况下,确切的代码可以正常工作。

busg9geu

busg9geu1#

Google Cloud Storage有一个关于控制公共数据访问的文档:

根据这个documentation
由于云存储本身不支持HTTPS自定义域,因此本教程使用云存储和外部应用负载均衡器通过HTTPS从自定义域提供内容。有关通过HTTPS从自定义域提供内容的更多方法,请参阅HTTPS服务疑难解答。您还可以使用Cloud Storage通过HTTP提供自定义域内容,这不需要负载均衡器。
这将通知您创建一个负载均衡器服务,该服务可用于您自己域中的用户内容,并将存储桶用作服务后端。另一方面,您可以查看possible way around,它使用Google创建自定义域CDN。
这个博客的主要目标是FF:

  • 我想在我的网站上提供来自云桶的图像(比较隐形眼镜)。
  • 我想从我的域名cdn.kontaktlinsen-preisvergleich.de提供它
  • 我需要HTTPS的域,因为我的网站使用HTTPS无处不在,我不想混合。

这篇stackoverflow文章可以提供有关CDN实现的其他信息,以处理自定义域来服务于您的云存储对象。
其他可能有帮助的参考:

我建议的下一件事是在Issue tracking system and product feature request下提交一个bug。
免责声明:
这并没有一个具体的ETA,但是一旦你创建了bug,你就可以跟踪它的进度。

相关问题