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

如何使用Chopper实现文件上传?Retrofit转Chopper改造咨询

使用Chopper实现文件上传(替代Retrofit的Kotlin实现)

我来帮你搞定这个Chopper文件上传的转换问题~之前你用Kotlin+Retrofit的实现没问题,现在转Flutter+Chopper的话,关键是要把文件路径转换成Chopper能识别的MultipartFile对象,具体修改如下:

第一步:修改Chopper Service定义

原来的Service里@PartFile参数用了字符串路径,这不符合Chopper的要求——它需要接收MultipartFile类型的对象,所以先把参数类型改掉:

@Post(path: "create_plan")
@multipart
Future<Response> createPlan(
  @Field('name') String name,
  @PartFile('image') MultipartFile image, // 替换String为MultipartFile
);

如果要兼容文件为空的场景(和你原来Retrofit里的可空MultipartBody.Part?对应),可以把参数改成可空类型:

@PartFile('image') MultipartFile? image,

第二步:修改调用代码,将路径转为MultipartFile

在调用接口的地方,我们需要从文件路径创建MultipartFile对象,同时指定和之前Retrofit一致的文件类型image/*:

import 'package:http/http.dart' show MultipartFile, MediaType; // 记得导入这两个类

Future<Response> createPlan(BuildContext context, String name, String? path) async {
  try {
    // 处理文件路径为空的情况
    MultipartFile? imageFile;
    if (path != null && path.isNotEmpty) {
      imageFile = await MultipartFile.fromFile(
        path,
        contentType: MediaType('image', '*'), // 和Retrofit的"image/*"对应
        // 如果需要自定义文件名,可以添加filename参数,比如filename: "uploaded_image.jpg"
      );
    }
    final response = await _service.createPlan(name, imageFile);
    return response;
  } catch (e) {
    rethrow;
  }
}

补充说明

  • 确保你的项目已经正确依赖了chopper和http包(一般Chopper会自动依赖http,但如果没导包的话记得在pubspec.yaml里添加)
  • MultipartFile.fromFile默认会使用文件的原始名称发送给服务器,如果你需要像Retrofit那样自定义文件名,加上filename参数即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 12:07:51