如何使用 Chopper 发送文件?

How to send file using Chopper?

在我的 kotlin 项目中,我使用 retrofit 并且效果很好。

suspend fun createPlan(
    context: Context?,
    name: String,
    file: File?
): ABC? {

    val fileSignImage = file?.let {
        MultipartBody.Part.createFormData(
            "image",
            it.getName(),
            RequestBody.create("image/*".toMediaTypeOrNull(), it)
        )
    }

    return RetrofitFactory.apiCall(context) {
        RetrofitFactory.makeRetrofitService().createPlan(
            name.toRequestBody("text/plain".toMediaTypeOrNull()),
            fileSignImage
        )
    }} 

RetrofitService

@Multipart
@POST("create_plan")
fun createPlan(
    @Part("name") name: RequestBody,
    @Part image: MultipartBody.Part?
): Deferred<Response<WebApiResponse.ABCs>>

如果我想使用Chopper,正确的方法是什么?

这是我试过的

Future<Response> createPlan(
      BuildContext context, String name,String path) async {
    Response response;
    try {
      response = await _service.createPlan(
           name,path);
      return response;
    } catch (e) {
      rethrow;
    }
  }

服务

@Post(path: "create_plan")
@multipart
Future<Response> createPlan(
@Field('name') String name,@PartFile('image') String imagePath);

如何将 imagePath 转换为文件,以便使用 Chopper 将其作为文件传递给服务器?

有人吗?

查看 Chopper 的文档,PartFile 注释支持三种数据类型:

  • List<int>
  • String (path of your file)
  • MultipartFile (from package:http)

您目前正在使用 String,但由于未知原因它不适合您。第一个选项可能是最直接的,但第三个选项与您目前在 Retrofit 中的选项最相似,因此我们可以尝试一下。

import 'package:http/http.dart';

...

Future<Response> createPlan(BuildContext context, String name, String path) async {
  Response response;
  try {
    final bytes = (await File(path).readAsBytes()).toList();
    final file = MultipartFile.fromBytes('image', bytes);
    response = await _service.createPlan(
      name,
      file,
    );
    return response;
  } catch (e) {
    rethrow;
  }
}

服务

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

我设法使用 http 而不是 Chopper 上传文件。

   Future<http.Response> createPlan(String name, String path) async {
        var request = http.MultipartRequest(
            "POST",
            Uri.parse(
                "http://xxx"));

        request.fields['name'] = name;
        request.files.add(await http.MultipartFile.fromPath(
          'image',
          path,
        ));

        try {
          var streamedResponse = await request.send();
          var response = http.Response.fromStream(streamedResponse);
          return response;
        } catch (e) {
         rethrow;
        }
      }