Spring控制器:StreamingResponseBody的内容类型

时间:2017-11-16 21:53:25

标签: java spring spring-mvc

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

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

到目前为止,非常好 - 通过<img src="/image">在HTML中使用图片可以正常工作。

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

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

1 个答案:

答案 0 :(得分:8)

您可以将其包装在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);
}