Java 如何从Spring控制器传递带有文件的JSON对象数组?

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&

我想要一个SpringREST控制器,它返回一个包含文件的对象数组,基本上是一张图片。我能做的是:

  • 创建一个POJO
  • 获取图像并转换为基64字符串
  • 将此字符串作为字段放入POJO中
  • 将此POJO添加到ArrayList
  • 必要时重复步骤1-4
  • 将ArrayList附加到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服务的最佳方法是使用Spring
    MultiPartFile
    (这将为您处理大文件,存储在文件系统而不是内存中),将其保存到数据库中,并使用另一种方法获取您按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
    可以提供帮助。