java - 使用 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?
解决方案
您可以使用手动方法:
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();
}
}
推荐阅读
- r - R:使用图表包绘制马尔可夫模型(进行图表更改)
- java - 识别对象
- android - 即使项目被反编译,在android中加密字符串的安全方法?
- windows - PrintPreviewControl 和表单设计在另一个操作系统上的工作方式不同。VB.NET
- ios - 可操作的通知不显示动作 Swift 4
- mysql - MYSQL 在主查询中选择子查询结果的值
- python - 根据列表中的项目数创建框架
- javascript - 如何删除句子中特定单词的突出显示颜色保持其他单词突出显示
- django - Django 和 Pipelinedb:编程错误:列
.location_id 不存在 - android - Supwerpoered SDK AdvanceAudioPlayer Seek 无法在 Android 上运行