我正在使用以下简化代码通过 dio 发出多部分请求
Future<void> _updateAvatar(AssetEntity entity) async {
var file = await entity.file;
if (file == null){
ToastUtils.showShortError("image not found");
return;
}
var cropped = await ImageCropper().cropImage(
sourcePath: file.path,
aspectRatioPresets: [
CropAspectRatioPreset.square,
],
);
if (cropped == null){
ToastUtils.showInfo("crop canceled");
return;
}
var multipartFile = await ImageUtils.multipartFileFromFile(cropped);
if (multipartFile == null){
ToastUtils.showShortError("cannot create image file");
return;
}
await UserService.updateAvatar(multipartFile, (p) {
ToastUtils.showSuccessful("avatar is updated~");
});
}
static Future<http.MultipartFile?> multipartFileFromFile(File? file) async {
if (file == null) {
return null;
}
String uri = file.path;
int dotIndex = uri.lastIndexOf(".");
String filename = DateTime.now().toString() + uri.substring(dotIndex);
http.MultipartFile mf = await http.MultipartFile.fromPath("file", file.path, filename: filename);
return mf;
}
static Future<void> updateAvatar(http.MultipartFile file, Function(String) responseHandler) async {
dio.FormData files = dio.FormData.fromMap({
'file': file,
});
await HttpUtils.uploadWithDefaultClient<String?>('/service/user/current/avatar/update', files, null, (data){
if (data == null){
return;
}
String avatar = data;
Global.user!.avatar = avatar;
for (Function listener in avatarListeners) {
listener(avatar);
}
responseHandler(avatar);
});
}
Future<custom.Response<Map<String, dynamic>?>> postMultipart(String url, FormData formData, [Function(int, int)? onProgress]) async {
var dio = Dio();
if (host != null){
dio.options.baseUrl = host!;
}
dio.options.headers = {
...headers,
'Cookie': 'worldstreet_at=$accessToken',
};
return await _handleDioRequest(dio.post(url, data: formData, onSendProgress: onProgress));
}
但是,dio 一直给我 http 状态代码 400。我相信请求有问题。
这是我使用 Spring Java 的服务器代码:
@RequestMapping("/current/avatar/update")
public String updateCurrentUserAvatar(@RequestPart("file") MultipartFile file){
Long uid = LoginUtils.getUid();
User user = userService.selectByUid(uid);
FileInfo fileInfo = fileService.uploadAvatar(file);
ExceptionUtils.failIf(fileInfo == null, "upload failed");
String avatar = fileInfo.getUrl();
if (avatar != null){
fileService.deleteFile(user.getAvatar());
user.setAvatar(avatar);
}
userService.update(user);
return avatar;
}
这是我的服务器对请求的说法
[org.springframework.web.multipart.support.MissingServletRequestPartException: Required request part 'file' is not present]
我可以使用 c# 和 postman 发出上传请求,但 flutter dio 一直告诉我错误。
我尝试将服务器的
@RequestPart
更改为 @RequestParam
,将 ContentType
设置为 `multipart/form-data` None 仍然不起作用。
更改服务器或前端代码对我来说都很好。
提前致谢!
我发现问题了!
我使用的是 http 包中的
MultipartFile
,而不是 dio 包。更改为 dio
修复了它!