java 如何创建采用路径的端点,加载映像并将其提供给客户端

hivapdat  于 2023-01-04  发布在  Java
关注(0)|答案(2)|浏览(140)

我想通过将图像转换为字节来为客户端提供图像,但由于某种原因,byteArrayOutputStream.toByteArray()为空。我得到的响应状态为200,这意味着它已被服务。我看了各种文档,介绍如何使用BufferedImage从目录中阅读图像文件,然后将BufferedImage转换为oracle https://docs.oracle.com/javase/tutorial/2d/images/loadimage.htmlhttps://docs.oracle.com/javase/tutorial/2d/images/saveimage.html中的byteArray,但由于某种原因,byteArray仍然是空的
该控制器

@GetMapping(path = "/get/image/{name}")
public ResponseEntity<byte[]> displayImage(String name) throws IOException {
        String photoPathFromDatabase = productRepository.findPhotoByName(name);
        Path path = Paths.get(photoPathFromDatabase);

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();


        BufferedImage image = ImageIO.read(path.toFile()); // Reading the image from path or file
        String fileType = Files.probeContentType(path.toFile().toPath()); // Getting the file type
        ImageIO.write(image, fileType, byteArrayOutputStream); // convert from BufferedImage to byte array
        byte[] bytes = byteArrayOutputStream.toByteArray();

        return ResponseEntity
                .ok()
                .contentType(MediaType.valueOf(fileType))
                .body(bytes);
    }

在我调试了

方法之后

ego6inou

ego6inou1#

应该直接读取文件的字节,而不是使用来自不同类的大量方法,这可以通过类java.nio.file.Files来完成。

byte[] contentBytes = Files.readAllBytes(path); //Throws IOException
j0pj023g

j0pj023g2#

可能是文件扩展名设置不正确。
您可以创建一个新的方法来获取文件扩展名,或者使用Apache Commons IO中的FilenameUtils.getExtension

public static Optional<String> getExtensionByStringHandling(String filename) {
    return Optional.ofNullable(filename)
            .filter(f -> f.contains("."))
            .map(f -> f.substring(filename.lastIndexOf(".") + 1));
}

然后更改您的ImageIO以采用此文件扩展名。

String fileExtention= getExtensionByStringHandling(file.getName()).orElseThrow(()->new RuntimeException("File extension not found"));
ImageIO.write(image, fileExtention, byteArrayOutputStream);

相关问题