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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:45:02