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
相关产品推荐
相关产品推荐

