如何使用Spring Controller中的文件传递JSON对象数组?

时间:2017-02-21 07:49:55

标签: java spring rest file web

我希望有一个Spring REST Controller,它返回一个包含文件的对象数组,基本上是一张图片。我能做的是:

  1. 创建POJO
  2. 获取图片并转换为基本64字符串
  3. 将此字符串作为POJO
  4. 中的字段
  5. 将此POJO添加到ArrayList
  6. 根据需要重复步骤1-4
  7. 将ArrayList附加到ResponseEntity
  8. 将回复实体发回客户端
  9. 从客户端获取文件并在画布上绘制图像
  10. 或在代码中,如下所示:

    @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);
    }
    

    我听说转换和使用base 64字符串浪费空间并不是最好的做法。是否有替代或更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:0)

您听错了,Base64文件大小增加 33%如果您将要上传的所有文件都放在内存中,则存在内存不足异常的高风险。在我看来,将图像上传到Spring Web服务的最佳方法是创建一个使用Spring MultiPartFile上传图像的方法(这将为您处理大文件,存储在文件系统而不是内存中),将其保存到数据库和另一种方法获取您通过id或name存储的图像。

我的意思的一个例子:

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%的文件大小。

另一种选择是让客户端一次获得一个图像,然后让它构建包含所有文件的列表。顺便说一句,您的选择取决于图像大小,以及有多少用户将使用此服务。