Flutter中如何用http包实现上传文件的PUT请求,对应curl的-F参数传文件而非路径
实现步骤与代码
首先在pubspec.yaml中添加http依赖:
dependencies: flutter: sdk: flutter http: ^1.1.0 # 可替换为最新稳定版本
核心上传代码
import 'dart:io'; import 'package:http/http.dart' as http; /// [fileObject] 你拿到的文件对象实例 /// [accessToken] 你的接口鉴权令牌 Future<void> uploadFile(File fileObject, String accessToken) async { // 构造请求地址 final uploadUri = Uri.parse('https://api.groupdocs.cloud/v1.0/parser/storage/file/hello.pdf'); // 初始化PUT类型的多表单请求 final request = http.MultipartRequest('PUT', uploadUri); // 添加请求头 request.headers.addAll({ 'accept': 'application/json', 'authorization': 'Bearer $accessToken', 'x-aspose-client': 'Containerize.Swagger', // 无需手动设置Content-Type,MultipartRequest会自动生成带正确boundary的请求头 }); // 直接通过文件对象构造上传参数,无需单独传入路径字符串 request.files.add( await http.MultipartFile.fromPath( 'file', // 对应curl中-F的参数名 fileObject.path, filename: 'hello.pdf', // 可自定义上传后显示的文件名 ) ); // 如果你手里只有文件的字节数据(无本地文件实体),可以用下面的方法构造,完全不需要路径: // final Uint8List fileBytes = await fileObject.readAsBytes(); // request.files.add( // http.MultipartFile.fromBytes( // 'file', // fileBytes, // filename: 'hello.pdf', // ) // ); // 发送请求并处理返回结果 final streamedResponse = await request.send(); final response = await http.Response.fromStream(streamedResponse); if (response.statusCode == 200) { print('上传成功:${response.body}'); } else { print('上传失败,状态码${response.statusCode},错误信息:${response.body}'); } }
注意事项
- 不要手动设置
multipart/form-data类型的请求头,http包会自动补全带边界标识的请求头,手动设置反而会导致请求异常。 - 如果是内存中的文件数据(比如刚拍摄未存储的图片、下载得到的字节流),直接用
MultipartFile.fromBytes构造即可,完全不涉及本地文件路径。
内容的提问来源于stack exchange,提问作者Harsh Vardhan
相关产品推荐
相关产品推荐

