【问题标题】:Use InputStream instead of FileUtils? [duplicate]使用 InputStream 而不是 FileUtils? [复制]
【发布时间】:2021-07-10 21:01:02
【问题描述】:

我需要转换我的控制器以返回输入流的类型,因为这是解决我的 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 seeing local files?

【问题讨论】:

  • 您要返回InputStream 还是ResponseEntity&lt;InputStream&gt;
  • 我想只是 'InputStream' ?必须玩弄两者才能看到哪个有效
  • 我想您可能希望删除最后一段中从问号到 URL 末尾的所有内容,因为它可能应该链接到问题,而不是下面的评论。

标签: java


【解决方案1】:

您可以使用手动方法:

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

或者只是改变方法返回一个RequestBody&lt;InputStream&gt;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-29
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 2015-08-14
    • 2010-10-09
    相关资源
    最近更新 更多