一尘不染

如何使用Webflux上传多个文件?

spring-boot

如何使用Webflux上传多个文件?

我发送内容类型的请求:multipart/form-data正文包含一个 部分 ,该 部分的 值是一组文件。

要处理单个文件,请按以下步骤操作:

Mono<MultiValueMap<String, Part> body = request.body(toMultipartData());
body.flatMap(map -> FilePart part = (FilePart) map.toSingleValueMap().get("file"));

但是如何对多个文件执行此操作?

PS。还有另一种方法可以在webflux中上传一组文件吗?


阅读 984

收藏
2020-05-30

共1个答案

一尘不染

我已经找到了一些解决方案。假设我们发送带有参数 文件 的http POST请求,该参数 文件 包含我们的文件。

注释响应是任意的

  1. RestController与RequestPart
        @PostMapping("/upload")
    public Mono<String> process(@RequestPart("files") Flux<FilePart> filePartFlux) {
        return filePartFlux.flatMap(it -> it.transferTo(Paths.get("/tmp/" + it.filename())))
            .then(Mono.just("OK"));
    }
  1. 具有ModelAttribute的RestController
        @PostMapping("/upload-model")
    public Mono<String> processModel(@ModelAttribute Model model) {
        model.getFiles().forEach(it -> it.transferTo(Paths.get("/tmp/" + it.filename())));
        return Mono.just("OK");
    }

    class Model {
        private List<FilePart> files;
        //getters and setters
    }
  1. HandlerFunction的功能方式
        public Mono<ServerResponse> upload(ServerRequest request) {
        Mono<String> then = request.multipartData().map(it -> it.get("files"))
            .flatMapMany(Flux::fromIterable)
            .cast(FilePart.class)
            .flatMap(it -> it.transferTo(Paths.get("/tmp/" + it.filename())))
            .then(Mono.just("OK"));

        return ServerResponse.ok().body(then, String.class);
    }
2020-05-30