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

lxkprmvk  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(284)

我想写一个spring控制器方法,从存储器返回一个图像。下面是我目前的版本,但它有两个问题:
@getmapping注解需要“products”参数,该参数是媒体类型的字符串数组。如果该参数不存在,则程序不工作;它只是将图像数据显示为文本。问题是,如果我想支持一个额外的媒体类型,那么我必须重新编译程序。有没有办法从viewimg方法内部设置“products”媒体类型?
下面的代码将显示除svg以外的任何图像类型,svg将仅显示消息“由于包含错误,无法显示图像”。web浏览器(firefox)将其标识为媒体类型“webp”。但是,如果我从“products”字符串数组中删除除“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;
}
gev0vcfq

gev0vcfq1#

我推荐 FileSystemResource 用于处理文件内容。你可以避免 .contentType(..) 如果您不想发送 Content-Type 价值观。

@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);
}

相关问题