You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带自定义域名的GCS签名URL上传大文件失败问题求助

问题分析与解决方案

针对你使用GCS签名URL结合自定义CNAME(通过负载均衡路由)时大文件上传超时的问题,以下是针对性的排查和解决步骤:


1. 修正签名URL的CNAME参数配置

cname参数仅需填写纯域名,无需携带https://协议头。带协议会导致GCS签名验证时主机头不匹配,大文件上传(可能涉及分块或重试)时验证失败进而触发超时。

修改后的生成代码:

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, // 与负载均衡超时保持一致
    contentType: 'application/octet-stream',
    cname: 'example.com' // 移除https://前缀
  };

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

  return url
}

2. 调整负载均衡超时配置

负载均衡默认超时时间较短,无法覆盖大文件上传的耗时。需要将后端服务的超时参数调整为与签名URL过期时间匹配(比如15分钟):

  • 进入GCP控制台的负载均衡后端服务设置
  • 修改连接超时和响应超时为900s(15分钟)
  • 确保负载均衡的前端转发规则也使用一致的超时配置

3. 确保负载均衡正确转发主机头

GCS签名URL验证依赖请求的Host头,必须保证负载均衡将客户端请求的Host头完整转发到存储桶:

  • 在后端服务设置中启用保留客户端请求头,明确包含Host头
  • 检查URL映射规则,确保请求路径未被修改(GCS需要完整路径匹配签名URL)

4. 优化前端上传配置

Axios默认的请求限制可能导致大文件上传中断,需调整相关参数:

axios.put(
  url,
  file,
  {
    headers: {
      'content-type': 'application/octet-stream',
    },
    onUploadProgress(progressEvent) {
      console.log(`Upload Progress: ${JSON.stringify(progressEvent)}`)
    },
    maxContentLength: Infinity,
    maxBodyLength: Infinity,
    timeout: 15 * 60 * 1000 // 与签名URL过期时间一致
  }
)

5. 验证存储桶CORS配置

大文件上传可能涉及多次预检请求,需确保CORS配置允许自定义域名的所有必要请求:

[
  {
    "origin": ["https://example.com"],
    "method": ["GET", "PUT", "OPTIONS"],
    "responseHeader": ["Content-Type", "Authorization"],
    "maxAgeSeconds": 3600
  }
]

内容的提问来源于stack exchange,提问作者Noman Ur Rehman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:02:29