You need to enable JavaScript to run this app. Flutter用MultipartRequest上传到Google Storage返回403但CURL正常
优惠活动
大模型
产品
解决方案
定价
更多

Flutter用MultipartRequest上传到Google Storage返回403但CURL正常

问题原因

  • 错误使用了MultipartRequest请求类型:你的CURL命令是直接把文件二进制作为PUT请求体上传,而MultipartRequest会自动将请求体封装为multipart/form-data格式,谷歌云存储的签名URL校验会因为请求体格式、内容和签名时预期不一致直接返回403。
  • Content-Type请求头格式错误:代码中给HttpHeaders.contentTypeHeader对应的值多写了Content-Type: 前缀,实际请求会变成Content-Type: Content-Type: application/octet-stream,属于非法请求头,会触发校验失败。
  • 读取文件字节格式错误:使用asInt64List()转换字节数据会改变原始二进制内容的长度和结构,和你本地文件实际内容不一致,导致签名校验不通过。

修复后代码

Future<http.Response?> uploadVideo({required String uploadURL, required String filePath}) async {
  try {
    ByteData bytes = await rootBundle.load(filePath);
    // 正确转换为Uint8List格式的原始二进制
    Uint8List fileBytes = bytes.buffer.asUint8List();
    Uri uri = Uri.parse(uploadURL);
    // 直接使用普通PUT请求,不要用Multipart
    final response = await http.put(
      uri,
      body: fileBytes,
      headers: {
        HttpHeaders.contentTypeHeader: 'application/octet-stream',
      },
    );
    return response;
  } on SocketException catch (e) {
    showNoInternetError(e);
    return null;
  }
}

内容的提问来源于stack exchange,提问作者Nils Tierecke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 18:06:03