Java 如何从Spring控制器传递带有文件的JSON对象数组?
我想要一个SpringREST控制器,它返回一个包含文件的对象数组,基本上是一张图片。我能做的是:Java 如何从Spring控制器传递带有文件的JSON对象数组?,java,spring,rest,file,web,Java,Spring,Rest,File,Web,我想要一个SpringREST控制器,它返回一个包含文件的对象数组,基本上是一张图片。我能做的是: 创建一个POJO 获取图像并转换为基64字符串 将此字符串作为字段放入POJO中 将此POJO添加到ArrayList 必要时重复步骤1-4 将ArrayList附加到ResponseEntity 将响应实体发送回客户端 从客户端获取文件并在画布中绘制图像 或者在代码中,类似这样: @RequestMapping(value = "/getInfo") public ResponseEntity&
@RequestMapping(value = "/getInfo")
public ResponseEntity<Object> getInfo() throws Throwable {
ArrayList<Object> objList = new ArrayList<Object>();
for (int i = 0; i < 10; i++) {
Object obj = new Object();
obj.setField1(0);
obj.setField2(0);
String stringImg = // Convert image to base 64 string
obj.setStringImg(stringImg);
objList.add(obj);
}
return new ResponseEntity<Object>(objList, HttpStatus.OK);
}
@RequestMapping(value=“/getInfo”)
公共响应getInfo()抛出可丢弃的{
ArrayList objList=新的ArrayList();
对于(int i=0;i<10;i++){
Object obj=新对象();
对象设置字段1(0);
对象设置字段2(0);
String stringImg=//将图像转换为基64字符串
对象设置串接(串接);
objList.add(obj);
}
返回新的响应状态(objList,HttpStatus.OK);
}
我听说转换和使用base64字符串会浪费空间,并不是最佳实践。有没有其他更好的方法呢?你没听错,
Base64
会将文件大小增加到33%,如果你将所有要上传的文件都放在内存中,你就有很高的内存溢出风险。在我看来,将图像上传到SpringWeb服务的最佳方法是使用SpringMultiPartFile
(这将为您处理大文件,存储在文件系统而不是内存中),将其保存到数据库中,并使用另一种方法获取您按id或名称存储的图像
我的意思的一个例子:
public long uploadImage(@RequestParam("file") MultipartFile file)){
InputStream in = new ByteArrayInputStream(file.getBytes());
// save the file to the database as blob or clob
return file id or name;
}
然后在另一种方法中,从数据库中以Blob或Clob的形式获取图像,将其转换为字符串,创建列表并将其返回给客户机。创建包含所有文件的列表会将文件放在内存中,但至少会为每个文件保存文件大小的33%
另一种选择是让客户端一次获取一个图像,并让它构造包含所有文件的列表。顺便说一下,您的选择取决于图像的大小,以及有多少用户将使用此服务。只需返回URL并以常规的
图像/jpeg
格式获取图像?要转换的图像存储在文件系统中或通过web服务传递?@amicoderozer它存储在文件系统中,但传递给web服务。@chrylis图像应该是POJO中的一个字段。我有一个多个POJO的列表,我想通过这种方式将其发送回客户机。如何获取URL、获取图像并将其绘制在画布上?不要直接返回POJO,使用提供URL的DTO。SpringDataREST尽管存在各种问题,但有一个ControllerLinkBuilder
可以提供帮助。