遇有问题:“Spring WebFlux 前后端分离 文件上传”
以这个为主,辅以 “kotlin”、“gradle”
maven
gradle
文件上传
@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());
}
Kotlin
@PostMapping(value = ["/admin/nav/upload"], consumes = [MediaType.MULTIPART_FORM_DATA_VALUE])
fun handleFileUpload(@RequestPart("file") filePart: FilePart): Mono<Status> {
val tempFile = Files.createTempFile("nav-", filePart.filename())
//one
var channel = AsynchronousFileChannel.open(tempFile, StandardOpenOption.WRITE)
DataBufferUtils.write(filePart.content(), channel, 0).subscribe()
// //two
// filePart.transferTo(tempFile.toFile())
return Mono.just(Status.Ok(tempFile.toString()))
}
使用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。