transferTo を使用してファイルをアップロードするときに wenflux が応答しない理由を解決する
webflux を学んだばかりですが、ファイルをアップロードする方法を知りたいですか? そこで
Baiduで検索してたくさんの回答を見ましたが、最終的にはこんな感じになりました
(どれも同じで、見た目も全く同じで、模倣が深刻すぎると言いたいだけです)。
動作しますが、方法 2 を使用したいのですが、何も動作しません。:
//NOTE 方法1
AsynchronousFileChannel channel =
AsynchronousFileChannel.open(tempFile, StandardOpenOption.WRITE);
DataBufferUtils.write(filePart.content(), channel, 0)
.doOnComplete(() -> {
System.out.println("finish");
})
.subscribe();
//NOTE 方法二
//filePart.transferTo(tempFile.toFile());
解決策: (面白いことに、これを初めて知ったので、サブスクライブしないと実行されないという問題を忘れていたので、最後にサブスクリプションを追加しました)
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public Mono<String> requestBodyFlux(@RequestPart("file") FilePart filePart) throws IOException {
//这一种就比较简单
// FileOutputStream outputStream=new FileOutputStream("src/main/resources/".concat(filePart.filename()));
// DataBufferUtils.write(filePart.content(),outputStream).subscribe();
//这个方法最简单
File file=new File("src/main/resources/".concat(filePart.filename()));
filePart.transferTo(file).subscribe();
return Mono.just(filePart.filename());
}
そういう人たちに、それをコピーして自分で試してみるようアドバイスしていただけますか? なんという時間の無駄でしょう...
webflux の webclient を使用したファイルのアップロード
この Web サイトでは、Web クライアントでのファイルのアップロードについて非常に詳しく説明されています (https://www.modb.pro/db/143719)。
コードが少ないものを選択して投稿します。
WebClient webClient = WebClient.create("http://127.0.0.1:8080");
String fileName = webClient
.post()
.uri("/upload")
.body(BodyInserters.fromMultipartData("file", new ByteArrayResource(Files.readAllBytes(Path.of("D:\\下载\\123.jpeg"))){
@Override
public String getFilename() {
return "456.png";
}
}))
.retrieve().bodyToMono(String.class).block();
System.out.println(fileName);