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

Flutter中使用http包调用图片去背景API时出现400 Bad Request错误的解决方法

解决Photoroom API移除图片背景时的400 Bad Request错误

Hey, let's break down why you're hitting that 400 error and fix it step by step. The error message Could not decode image, ensure image_file or image_file_b64 is set tells us exactly what's wrong: you're not sending the image data in the format the API expects. Right now you're just passing an image file path as a plain string, but the API needs either the actual image file (via multipart form upload) or a base64-encoded string of the image content.

方法1:使用Multipart上传本地图片(推荐)

This is the most straightforward way to send local image files to the API. We'll read the file and construct a multipart request:

import 'dart:io';
import 'package:http/http.dart' as http;

Future<void> removeBackGround(String imagePath) async {
  // 先检查目标图片是否存在
  final imageFile = File(imagePath);
  if (!await imageFile.exists()) {
    throw Exception('Image file not found at path: $imagePath');
  }

  final apiHeaders = {"X-API-Key": "e5adebcdc77**************"};
  
  // 构造multipart POST请求
  var request = http.MultipartRequest(
    'POST',
    Uri.parse("https://sdk.photoroom.com/v1/segment"),
  );
  
  // 添加API密钥到请求头
  request.headers.addAll(apiHeaders);
  
  // 将图片文件添加到请求体,字段名必须是`image_file`(API要求)
  request.files.add(await http.MultipartFile.fromPath(
    'image_file',
    imagePath,
  ));
  
  // 发送请求并处理响应
  final response = await request.send();
  
  if (response.statusCode == 200) {
    // 读取返回的无背景图片字节数据
    final resultImageBytes = await response.stream.toBytes();
    print("Background removed successfully!");
    // 这里可以将resultImageBytes保存为文件或用于展示
  } else {
    final errorDetails = await response.stream.bytesToString();
    throw Exception('Failed to process image: Error Code ${response.statusCode}\nDetails: $errorDetails');
  }
}

方法2:使用Base64编码上传图片

If you prefer working with strings, you can convert the image to a base64 string and send it via the image_file_b64 field:

import 'dart:io';
import 'dart:convert';
import 'package:http/http.dart' as http;

Future<void> removeBackGround(String imagePath) async {
  final imageFile = File(imagePath);
  if (!await imageFile.exists()) {
    throw Exception('Image file not found at path: $imagePath');
  }

  // 将图片文件转换为base64编码字符串
  final imageBytes = await imageFile.readAsBytes();
  final imageBase64 = base64Encode(imageBytes);
  
  final apiHeaders = {
    "X-API-Key": "e5adebcdc77**************",
    "Content-Type": "application/json", // 发送JSON格式的请求体需要设置这个头
  };
  
  final requestBody = {"image_file_b64": imageBase64};
  
  final response = await http.post(
    Uri.parse("https://sdk.photoroom.com/v1/segment"),
    body: jsonEncode(requestBody),
    headers: apiHeaders,
  );
  
  if (response.statusCode == 200) {
    print("Background removed successfully!");
    final resultImageBytes = response.bodyBytes;
    // 处理返回的图片字节数据
  } else {
    throw Exception('Failed to process image: Error Code ${response.statusCode}\nDetails: ${response.body}');
  }
}

关键注意事项

  • 确保你的API密钥有效,没有过期或权限限制
  • 始终检查图片路径是否正确、文件是否存在(上面的代码已添加检查逻辑)
  • 只上传API支持的图片格式:JPG、PNG、WEBP等
  • 使用multipart上传时,不要手动设置Content-Type为multipart/form-data,http.MultipartRequest会自动处理正确的请求头和边界值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 19:37:29