序
本文主要讲述一下spring webflux的文件上传和下载。
maven
org.springframework.boot spring-boot-starter-webflux
文件上传
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public MonorequestBodyFlux(@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 MonodownloadByWriteWith(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。