如何使用 spring boot 获取多个图像?

How get multiple images with springboot?

大家早上好, 我正在为我的学位创建一个 Web 应用程序,几天来我一直 运行 遇到与从数据库加载和检索图像相关的问题。 我可以上传照片没有大问题,我仍然留下控制器代码:

    @PostMapping()
public AckDto handleImagePost(@RequestParam ("file") MultipartFile file, @RequestParam Long userId, @RequestParam Long contestId) throws ServiceException, IOException {

    PhotoDto photoDto = new PhotoDto();
    photoDto.setTitle("Test Image");
    photoDto.setDescription("Test description");
    photoDto.setImage(file.getBytes());
    return photoService.saveImagineFile(photoDto, userId, contestId);

}

虽然为了获取照片,我只能使用以下方法拍摄一张照片:

        @GetMapping(value = "/image", produces = MediaType.IMAGE_PNG_VALUE)
public Resource downloadImage(@RequestParam Long contestId) throws ServiceException, IOException {
    Photo photo = photoService.findByContest_Id(contestId);

    byte[] image = photoService.findByContest_Id(contestId).getImage();;


    return new ByteArrayResource(image);
}

而如果我尝试使用以下代码拍摄更多照片,显然会更改服务和存储库:

    @GetMapping(value = "/image", produces = MediaType.IMAGE_PNG_VALUE)
public List<Resource> downloadImage(@RequestParam Long contestId) throws ServiceException, IOException {

    List<Photo> photo = photoService.findByContest_Id(contestId);
    List<Resource> results = new ArrayList<>();

    for(Photo p : photo){
        results.add(new ByteArrayResource(p.getImage()));
    }

    return results;
}

它 return 给我以下错误:

org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class java.util.ArrayList] with preset Content-Type 'null'

我也尝试 return 一个 PhotoDto 列表,但它没有改变任何东西, 有什么想法吗?

如果您需要任何其他 class,请询问,我们会给您。

不确定以下是否适合您,但您可以压缩所有图像,然后将它们检索到一个唯一的文件中。

代码示例(取自下面的参考):

@GetMapping(value = "/zip-download", produces="application/zip")
public void zipDownload(@RequestParam List<String> name, HttpServletResponse response) throws IOException {
    ZipOutputStream zipOut = new ZipOutputStream(response.getOutputStream());
    for (String fileName : name) {
        FileSystemResource resource = new FileSystemResource(fileBasePath + fileName);
        ZipEntry zipEntry = new ZipEntry(resource.getFilename());
        zipEntry.setSize(resource.contentLength());
        zipOut.putNextEntry(zipEntry);
        StreamUtils.copy(resource.getInputStream(), zipOut);
        zipOut.closeEntry();
    }
    zipOut.finish();
    zipOut.close();
    response.setStatus(HttpServletResponse.SC_OK);
    response.addHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + zipFileName + "\"");
}

参考:https://www.devglan.com/spring-boot/spring-boot-file-upload-download

而不是 return 列表,return ResponseEntity。 它可能会起作用。

问题是无论您采用何种方式,前端都不太可能提取您的图像。

UUE 手动编码它们并将它们放入 HTTP headers 可能是您最好的选择。这样前端就可以遍历包含图像的 headers 并以它应该能够解码的格式一张一张地获取它们。

感谢大家,我解决了我不小心留下了一些我认为与其他人冲突的旧笔记的问题。