flutter dio 发出多部分请求

问题描述 投票:0回答:1

我正在使用以下简化代码通过 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 仍然不起作用。

更改服务器或前端代码对我来说都很好。

提前致谢!

spring flutter multipart dio
1个回答
0
投票

我发现问题了!

我使用的是 http 包中的

MultipartFile
,而不是 dio 包。更改为
dio
修复了它!

© www.soinside.com 2019 - 2024. All rights reserved.