![](/img/trans.png)
[英]What is the correct reactive pattern in Java Spring WebFlux to return a (large) file from the REST controller?
[英]Spring Webflux Rest Controller for image response correct return type
我正在創建一個返回圖像的 Spring WebFlux Controller。 基於類似的問題,我在下面嘗試了這個選項。
@RestController
@RequestMapping(value = "/image/*")
public class ImageController {
@RequestMapping(method = RequestMethod.GET, produces = MediaType.IMAGE_PNG_VALUE)
protected void doGet(ServerHttpRequest request, ServerHttpResponse response) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "jpg", baos);
DataBuffer imageData = response.bufferFactory().wrap(barr);
//returns empty content in response
//response.writeWith(Flux.just(imageData));
//returns valid image
response.writeWith(Flux.just(imageData)).block();
} catch (Exception e) {
e.printStackTrace();
}
}
圖像有效,我還可以看到 DataBuffer 有字節。 但是,它不會將響應發送回客戶端。
對該服務的響應成功(狀態 200),但負載為空(0 字節)。
任何人都可以在這里識別錯誤嗎?
[更新]
通過添加對塊的調用,我獲得了 Controller 以返回圖像:
response.writeWith(Flux.just(imageData)).block();
我還看到它通過調用 subscribe() 起作用:
response.writeWith(Flux.just(imageData)).subscribe();
這種類型的 controller 的正確方法是什么? 這是否等同於 Stream 上的 flush() 調用? 在 controller 方法完成后,WebFlux 框架不應該阻止或刷新響應 object 嗎?
類似問題:
這是我如何讓它工作的。 這是一個簡單的問題,但我遵循了用於傳統 Spring MVC 的相同方法(將圖像作為字節 stream 寫入 servlet 響應)。
@GetMapping(produces = MediaType.IMAGE_PNG_VALUE)
public Mono<DataBuffer> doGet(ServerHttpRequest request) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "png", baos);
baos.close();
byte[] barr = baos.toByteArray();
DataBuffer imageData =
DefaultDataBufferFactory.sharedInstance.wrap(barr);
return Mono.just(imageData);
} catch (Exception e) {
LOG.error("An unknown IO error occurred while writing pixel", e);
}
return Mono.empty();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.