Flutter使用S3预签名URL上传时请求体无效问题求助
问题分析与解决
报错Invalid argument(s): Invalid request body "[object File]"的核心原因是http.put的body参数不能直接传入File对象,Flutter的http库无法直接处理File类型作为请求体,必须先将文件转换为二进制字节数据。
修改后的代码
Future<void> uploadfile(String url, File image, String type) async { var urls = Uri.parse(url); try { // 读取文件的二进制字节数据 final fileBytes = await image.readAsBytes(); var response = await http.put( urls, body: fileBytes, // 传入字节数据而非File对象 headers: { "Content-Type": "image/$type", // 确保type对应实际格式,比如jpeg/png }, ); print("response status code: ${response.statusCode}"); } catch (e) { print("error: $e"); throw ('Error uploading photo'); } }
关键说明
- 必须通过
readAsBytes()将File转为字节数组,这是http请求体接受的有效格式 - Content-Type设置要匹配文件实际类型:
- 图片:
image/jpeg、image/png等(对应type参数传jpeg/png) - 文本文件:改为
text/plain(如果是JSON文本则用application/json)
- 图片:
- 上传文本文件时,同样需要先读取文件内容(
readAsString()或readAsBytes()),不能直接传File对象
内容的提问来源于stack exchange,提问作者Developer
相关产品推荐
相关产品推荐

