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

如何修复Flutter中swagger_dart_code_generator生成List<int>而非MultipartFile的问题

Flutter swagger_dart_code_generator生成multipart/form-data上传代码错误问题

在Flutter项目中,使用swagger_dart_code_generator从Swagger 2.0 JSON文件生成基于Chopper的API客户端代码时,针对multipart/form-data文件上传端点,生成的代码错误地将文件参数定义为List<int>?而非MultipartFile,这完全不适合处理文件上传场景,在Flutter Web上问题尤为突出——Web环境下dart:io不可用,使用cross_file包的XFile时会直接破坏multipart/form-data请求。

问题根源在于Swagger 2.0 JSON中使用了consumes: ["multipart/form-data"]和formData参数,但swagger_dart_code_generator对其产生了误解析,从而生成了List<int>类型的参数,导致同时面向Web和移动端的Flutter应用在文件上传时出现错误。

生成的错误代码

lib/gen/swagger/rest_api.swagger.dart:

/// uploadBannerForNotice
/// @param file file
/// @param id id
Future<chopper.Response<String>> restNoticeBannerIdPost({
  required List<int>? file,
  required String? id,
}) {
  return _restNoticeBannerIdPost(file: file, id: id);
}

/// uploadBannerForNotice
/// @param file file
/// @param id id
@Post(
  path: '/rest/notice/banner/{id}',
  optionalBody: true,
)
Future<chopper.Response<String>> _restNoticeBannerIdPost({
  @Field('file') required List<int>? file,
  @Path('id') required String? id,
});

lib/gen/swagger/rest_api.swagger.chopper.dart:

@override
Future<Response<String>> _restNoticeBannerIdPost({
  required List<int>? file,
  required String? id,
}) {
  final Uri $url = Uri.parse('/rest/notice/banner/${id}');
  final $body = <String, dynamic>{'file': file};
  final Request $request = Request(
    'POST',
    $url,
    client.baseUrl,
    body: $body,
  );
  return client.send<String, String>($request);
}

已尝试的方法

  • 使用swagger_dart_code_generator从Swagger 2.0 JSON生成API客户端代码,期望为multipart/form-data端点生成MultipartFile类型参数以支持XFile文件上传
  • 发现生成代码使用List<int>?作为文件参数,无法处理文件上传,尤其在Flutter Web环境下
  • 尝试在业务代码中手动将XFile转换为List<int>,但此方式对multipart/form-data请求无效
  • 怀疑Swagger 2.0 JSON存在兼容性问题,编写脚本将其转换为OpenAPI 3.0并更新构建流程

预期结果

  • 生成的代码应为文件参数使用MultipartFile类型,以支持正确的multipart/form-data上传
  • API客户端应能在Web和移动端无缝处理文件上传
  • 构建流程无需手动调整即可生成正确代码

预期代码

Future<chopper.Response<String>> restNoticeBannerIdPost({
  required MultipartFile? file,
  required String? id,
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 06:33:22