Я пытаюсь сделать вызов API с помощью https.MultipartRequest во Flutter

Я пытаюсь использовать этот API для дротика с помощью Flutter: https://pixcut.wondershare.com/api.html. Мои изображения сохраняются в базе данных в виде строк, и я использую методы для преобразования в нить, Uint8list или Изображение, как вы можете видеть ниже. Я пытаюсь использовать http.MultipartRequest для получения изображения без фона, но получаю эту ошибку:

[log] {"Code":10001,"Msg":"fail msg : http: no such file","Data":null}


void removeBackground(String image) async {
    var request = http.MultipartRequest(
        "POST", Uri.parse('https://pixcut.wondershare.com/openapi/api/v1/matting/removebg'));
    request.headers.addAll(
      {
        r'Content-Type': 'multipart/form-data',
        r'appkey': '061c4600615d101a56330357cafce7d9',
      },
    );
    request.files
        .add(http.MultipartFile.fromBytes('content', CleverCloset.dataFromBase64String(image) // use the real name if available, or omit
       ));

    await request.send().then((response) {
      http.Response.fromStream(response).then((onValue) {
        try {
          log(onValue.body);
          //stackChildren.add(MoveableStackItem(CleverCloset.imageFromBase64String(onValue.body).image));
          log("bb");
          setState(() {

          });
          // get your response here...
        } catch (e) {
          log(e.toString());
          log("ddd");
          // handle exeption
        }
      });
    });
  }

static Uint8List dataFromBase64String(String base64String) {
    return base64Decode(base64String);
  }

  static String base64String(Uint8List data) {
    return base64Encode(data);
  }
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
36
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

импортный пакет дио https://pub.dev/packages/дио

И замените эти коды своим кодом

 Future<String> uploadImage(File file) async {
    var dio = Dio();
    var url = "https://pixcut.wondershare.com/openapi/api/v1/matting/removebg";
     String fileName = file.path.split('/').last;
    FormData formData = FormData.fromMap({
      "content": await MultipartFile.fromFile(file.path, filename:fileName),
    });
    var response = await dio.post(url, data: formData,
        options: Options(contentType: "multipart/form-data",
            headers: {"appkey":"061c4600615d101a56330357cafce7d9"}));
    print(response.statusCode);
    return response.data;
  }
Ответ принят как подходящий

Проблема заключалась в том, что я должен передать file.path, поэтому я сохранил изображение во временном файле, чтобы передать путь, получить байты и отправить байты с кодом ниже, теперь он работает как прелесть!

Future<void> removeBackground(context, setState, Uint8List image) async {
    ProgressDialog pd = ProgressDialog(context: context);
    pd.show(max: 100, msg: 'Removing background...',
        backgroundColor: const Color(0xff393432),
    progressValueColor: const Color(0xff393432),
    progressBgColor: const Color(0xffE4BCB4),
    msgColor: const Color(0xffE4BCB4),);
    final appDir = await getTemporaryDirectory();
    File file = File('${appDir.path}/sth.jpg');
    await file.writeAsBytes(image);
    var headers = {
      'x-api-key': '72fe87f131787750e933dcdf80c775fdcf0ad704'
    };
    var request = http.MultipartRequest('POST', Uri.parse('https://sdk.photoroom.com/v1/segment'));
    request.files.add(await http.MultipartFile.fromPath('image_file', file.path));
    request.headers.addAll(headers);
    var response = await request.send();
    if (response.statusCode == 200) {
      final List<int> _bytes = [];
      response.stream.listen((value) {
        _bytes.addAll(value);
      }).onDone(() async {
        await file.writeAsBytes(_bytes);
        pd.close();
        setState(() {
          var a = CleverCloset.base64String(file.readAsBytesSync());
          stackChildren.add(MoveableStackItem(CleverCloset.imageFromBase64String(a).image));
        });
      });

    }
    else {
      setState(() {
        var base64String = CleverCloset.base64String(image);
        stackChildren.add(MoveableStackItem(CleverCloset.imageFromBase64String(base64String).image));
      });
    }
  }

Другие вопросы по теме