簡體   English   中英

Spring Webflux 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 webflux WebExceptionHandlder中將消息寫入http body

https://stackoverflow.com/a/58351771/6352160

這是我如何讓它工作的。 這是一個簡單的問題,但我遵循了用於傳統 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM