我如何写一个返回图像的Spring控制器方法?



我想写一个从存储返回图像的Spring控制器方法。下面是我的当前版本,但它有两个问题:

  1. @GetMapping注释需要'produces'参数,该参数是一个媒体类型的字符串数组。如果该参数不存在,程序将无法工作;它只是将图像数据显示为文本。问题是,如果我想支持额外的媒体类型,那么我必须重新编译程序。有没有办法从viewImg方法内部设置"产生"媒体类型?
  2. 下面的代码将显示除svg之外的任何图像类型,svg将只显示消息"该图像无法显示,因为它包含错误"。web浏览器(Firefox)将其识别为媒体类型"web "。但是,如果我从'produces'字符串数组中删除除了"image/svg+xml",则显示图像。

请建议如何编写一个更通用的控制器方法(以便它适用于任何媒体类型),并且没有svg媒体类型的问题。

下面是我的测试代码:
@GetMapping(value = "/pic/{id}",
produces = {
"image/bmp",
"image/gif",
"image/jpeg",
"image/png",
"image/svg+xml",
"image/tiff",
"image/webp"
}
)
public @ResponseBody
byte[] viewImg(@PathVariable Long id) {
byte[] data = new byte[0];
String inputFile = "/path/to/image.svg";
try {
InputStream inputStream = new FileInputStream(inputFile);
long fileSize = new File(inputFile).length();
data = new byte[(int) fileSize];
inputStream.read(data);
} catch (IOException e) {
e.printStackTrace();
}
return data;
}

我推荐使用FileSystemResource处理文件内容。如果您不想发送Content-Type值,可以避免.contentType(..)起始行。

@GetMapping("/pic/{id}")
public ResponseEntity<Resource> viewImg(@PathVariable Long id) throws IOException {
String inputFile = "/path/to/image.svg";
Path path = new File(inputFile).toPath();
FileSystemResource resource = new FileSystemResource(path);
return ResponseEntity.ok()
.contentType(MediaType.parseMediaType(Files.probeContentType(path)))
.body(resource);
}

相关内容

  • 没有找到相关文章

最新更新