首页 > 解决方案 > 使用 InputStream 而不是 FileUtils?

问题描述

我需要转换我的控制器以返回输入流的类型,因为这是解决我的 Docker 问题的解决方案之一。

我当前的控制器:

@GetMapping("/api/images/{filename}")
public ResponseEntity<byte[]> getImage(@PathVariable("filename") String filename) {
    String FILE_PATH_ROOT = context.getRealPath("/images/");
    byte[] image = new byte[0];
    try {
        image = FileUtils.readFileToByteArray(new File(FILE_PATH_ROOT + filename));
    } catch (Exception e) {
        e.printStackTrace();
    }
    return ResponseEntity.ok().contentType(MediaType.IMAGE_PNG).body(image);
}

知道如何将其重写为 InputStream 类型方法吗?目标是使用给定名称返回图像本身。

对于上下文,这是我之前的帖子,它引发了这个当前的问题 - Containerized spring app not seen local files?

标签: java

解决方案


您可以使用手动方法:

File file=new File(FILE_PATH_ROOT + filename));
byte[] image=new byte[(int)file.length()];
try(BufferedInputStream bis=new BufferedInputStream (new FileInputStream(file)){
    bis.read(image);
}catch (Exception e) {
    e.printStackTrace();
}

这可以使用以下方法简化Files.readAllBytes

File file=new File(FILE_PATH_ROOT + filename));
byte[] image=Files.readAllBytes(Path.of(FILE_PATH_ROOT + filename));

或者只是更改方法以返回 a RequestBody<InputStream>

@GetMapping("/api/images/{filename}")
public ResponseEntity<InputStream> getImage(@PathVariable("filename") String filename) {
    String FILE_PATH_ROOT = context.getRealPath("/images/");
    try{
        return ResponseEntity.ok().contentType(MediaType.IMAGE_PNG).body(new BufferedInputStream (new FileInputStream (new File(FILE_PATH_ROOT + filename))));
    }catch(IOException e){
        return ResponseEntity.notFound();
    }
}

推荐阅读