Spring控制器:StreamingResponseBody的Content-Type

Rüd*_*ulz 4 java spring spring-mvc

为了BufferedImage从spring-mvc中搜索最少量的代码(在服务类中绘制)Controller,我想出了以下内容:

@GetMapping(value = "/image", produces = "image/png")
public StreamingResponseBody image() {
    BufferedImage canvas = service.createImage();
    return outputStream -> ImageIO.write(canvas, "png", outputStream);
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,非常好 - 使用HTML中的图像通过<img src="/image">工作正常.

但是,spring根本不会发送任何Content-Type标题.与X-Content-Type-Options: nosniff响应中的服务一起,当直接打开图像URL时,这会导致浏览器窗口中的垃圾.

如何以最弹性友好的方式提供内容类型标题(即不HttpServletResponse直接使用)?

ESa*_*ala 10

您可以将其包装在a中ResponseEntity<...>,这样您就可以通过响应构建器轻松修改响应中的所有参数:

@GetMapping(value = "/image", produces = "image/png")
public ResponseEntity<StreamingResponseBody> image() {
    BufferedImage canvas = service.createImage();

    StreamingResponseBody stream = outputStream ->
            ImageIO.write(canvas, "png", outputStream);

    return ResponseEntity.ok()
        .contentType(MediaType.IMAGE_PNG)
        .body(stream);
}
Run Code Online (Sandbox Code Playgroud)