Spring MVC \ Boot控制器如何将图像列表返回到前端,通过AJAX处理它?

时间:2016-11-19 14:53:35

标签: spring spring-mvc spring-boot

我发现使用Spring返回图像列表时遇到了一些困难(我正在使用Spring Boot应用程序,但我认为使用Spring MVC是一样的。)

所以基本上过去我开发了一个控制器方法,将单个图像返回给我的前端,如下所示:

@RequestMapping(value = "getAccomodationMasterImageById",
                method = RequestMethod.GET,
                produces = MediaType.IMAGE_JPEG_VALUE)
public ResponseEntity<InputStreamResource> getAccomodationMasterImageById(Long accomodationId) throws DataAccessException {
    log.debug("getAccomodationMasterImageById START");

    InputStreamResource result = null;
    result = accomodationMediaService.getAccomodationMasterImageById(accomodationId);

    log.debug("getAccomodationMasterImageById END");

    return ResponseEntity.ok(result);
}

图像由浏览器返回并呈现的 InputStreamResource 对象表示。 它工作正常,用户通过GET HttpRequest从浏览器调用资源,控制器方法将渲染的图像返回给浏览器。

现在我的问题是我必须实现一个新的控制器方法,它返回一个图像列表而不是一个图像,所以我尝试做这样的事情:

@RequestMapping(value = "getListAccomodationImagesById",
                method = RequestMethod.GET,
                produces = MediaType.IMAGE_JPEG_VALUE)
public ResponseEntity<InputStreamResource> getListAccomodationImagesById(Long accomodationId, Boolean isMasterImageIncluded) throws ServiceException {

    log.debug("getListAccomodationImagesById START");

    List<InputStreamResource> result = accomodationMediaService.getAcccomodationImageListById(accomodationId, isMasterImageIncluded);

    return ResponseEntity.ok(result);

    log.debug("getListAccomodationImagesById END");
}

第一个问题是在这一行我有一个错误(在编译之前):

return ResponseEntity.ok(result);

似乎 ResponseEntity.ok()方法无法接受列表作为输入参数(与单个图像相同)。为什么呢?

除此之外,我认为可能这种返回图像列表的策略是错误的,因为:

必须提供必须显示图像的PHP控制器。在我有一个图像之前,我可以简单地调用与第一个控制器方法相关联的URI,并且图像显示在调用它的位置。

但是当我必须检索图像列表时,这些图像必须用特定的逻辑显示(所以我认为最好通过JQuery检索图像列表,然后是实现可视化逻辑的JQuery)

那么,将控制器中的图像列表返回到前端的标准解决方案是什么?它将通过JQuery处理的AJAX调用来检索它?也许最好将每个图像返回到一个字节数组?那么我可以返回一个字节数组的数组吗? (每个元素代表列表中的单个图像)。

最聪明的解决方案是什么?

2 个答案:

答案 0 :(得分:1)

按列表,你的意思是包含图像的zip文件?在一天结束时,你的控制器将通过Http返回响应。如果不使用网络套接字,它就无法为请求返回多个响应。

无论您认为合适,都可以解释响应消息,因此它可以包含1个接一个的图像或zip文件。例如,一个字节数组,在您的标题中,您可以给出图像开始和结束位置的位置。但我建议不要在一个回复中返回许多图像。与单个URI相比,客户端在缓存结果时会遇到更多麻烦。

我建议您从REST主体借用并返回包含所有单个图像的超链接的JSON响应,然后客户端可以按照这些链接并抓取图像。如果客户想要下载所有文件,则可以使用zip文件。

答案 1 :(得分:0)

很可能您已经解决了该问题。该ResponseEntity.ok(result)上的编译错误是因为您已将Response声明为单个实体“ InputStreamResource”,但正在尝试返回实体列表。

相关问题