本文主要講述一下spring webflux的文件上傳和下載。java
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency>
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public Mono<String> requestBodyFlux(@RequestPart("file") FilePart filePart) throws IOException { System.out.println(filePart.filename()); Path tempFile = Files.createTempFile("test", filePart.filename()); //NOTE 方法一 AsynchronousFileChannel channel = AsynchronousFileChannel.open(tempFile, StandardOpenOption.WRITE); DataBufferUtils.write(filePart.content(), channel, 0) .doOnComplete(() -> { System.out.println("finish"); }) .subscribe(); //NOTE 方法二 // filePart.transferTo(tempFile.toFile()); System.out.println(tempFile.toString()); return Mono.just(filePart.filename()); }
使用RequestPart來接收,獲得的是FilePart
FilePart的content是Flux<DataBuffer>,可使用DataBufferUtils寫到文件
或者直接使用transferTo寫入到文件
@GetMapping("/download") public Mono<Void> downloadByWriteWith(ServerHttpResponse response) throws IOException { ZeroCopyHttpOutputMessage zeroCopyResponse = (ZeroCopyHttpOutputMessage) response; response.getHeaders().set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=parallel.png"); response.getHeaders().setContentType(MediaType.IMAGE_PNG); Resource resource = new ClassPathResource("parallel.png"); File file = resource.getFile(); return zeroCopyResponse.writeWith(file, 0, file.length()); }
這裏將數據寫入ServerHttpResponse
使用webflux就沒有以前基於servlet容器的HttpServletRequest及HttpServletReponse了,取而代之的是org.springframework.http.server.reactive.ServerHttpRequest以及org.springframework.http.server.reactive.ServerHttpResponse。react