Как отправить файл с помощью 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?

Кто угодно?

2 ответа

Решение

Мне удалось загрузить файл, используя 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;
        }
      }

Изучив документацию по Chopper, PartFile аннотация поддерживает три типа данных:

  • List<int>
  • String (путь к вашему файлу)
  • MultipartFile (из пакета: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,
);
Другие вопросы по тегам