如何使用 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 并以它应该能够解码的格式一张一张地获取它们。
感谢大家,我解决了我不小心留下了一些我认为与其他人冲突的旧笔记的问题。
大家早上好, 我正在为我的学位创建一个 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 并以它应该能够解码的格式一张一张地获取它们。
感谢大家,我解决了我不小心留下了一些我认为与其他人冲突的旧笔记的问题。