我必须以二进制字符串形式将 png/jpg 图像发送到服务器。 Swagger 中还指定请求的 content-type 必须是“multipart/form-data”。
我使用 ImagePicker 包选择图像,然后将图像转换为 base64Encoded 字符串:
var photoAsBytes = await profilePhoto.readAsBytes();
List<int> photoAsIntList = photoAsBytes.toList();
String base64EncodedPhoto = base64Encode(photoAsIntList);
RequestResult? reqResult = await UserApiRequest.addUserPhoto(
base64EncodedPhoto
);
之后我发送http请求:
String apiBaseUrl = SecretService.instance.apiBaseUrl;
Uri requestPath = Uri.parse("$apiBaseUrl$requestUrl");
var request = MultipartRequest("POST", requestPath);
request.headers.addAll(requestHeaders);
var imageFile = MultipartFile.fromString(
"file",
requestBody as String,
contentType: MediaType("multipart", "form-data")
);
request.files.add(imageFile);
Response response = await Response.fromStream(await request.send());
print("Result: ${response.statusCode}");
我应该获取图像的路径作为服务器的响应,但我在服务响应中收到“InvalidFile”错误。我做错了什么?
我怀疑这个问题是你对原始文件数据进行base64编码。这是我为 MultipartForm 数据所做的实现:
FormData getFileFormData(String key, List<PlatformFile> files) {
final fileMap = files.map((file) => MapEntry(
key,
MultipartFile(
kIsWeb
? file.readStream!
: file.path != null
? File(file.path!).readAsBytes().asStream()
: Stream.fromIterable([file.bytes!.toList()]),
file.size,
filename: file.name)));
final formData = FormData();
formData.files.addAll(fileMap);
return formData;
}
此实现尝试考虑从网络和移动设备上的文件选择器接收到的数据的差异。我认为这句话:
File(file.path!).readAsBytes().asStream()
就是你所需要的。您需要将文件字节转换为流。