从Web服务SPRINGBOOT + REST + MAVEN发送多个图像

时间:2016-07-13 12:41:12

标签: web-services rest spring-boot

我正在Spring boot restful web App中编写一个Web服务,我正在向任何想要使用它的人发送图像,这是一个对我有用的代码片段

@RequestMapping(value = "/photo_1",method = RequestMethod.GET )  
public ResponseEntity<byte[]> greeting_image_1(@RequestParam(value="name", defaultValue="World") String name) throws IOException{
    InputStream in = getClass().getResourceAsStream("/images/someimage.jpg");       
    byte[] a = IOUtils.toByteArray(in);
    final HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.IMAGE_JPEG); 
    return new ResponseEntity<byte[]>(a,headers,HttpStatus.CREATED);            
}

如果我想从Web服务返回单个图像

,此Web服务可以正常运行

但是,如果我想要返回图像数组(即超过1张图像)

非常感谢任何帮助。

问候,

2 个答案:

答案 0 :(得分:1)

这是我编写的示例代码,用于生成包含多个图像的多部分响应。它被Firefox正确使用,并提示在响应中保存每个图像。

public ResponseEntity<byte[]> showImages () throws IOException {
    String boundary="---------THIS_IS_THE_BOUNDARY";
    List<String> imageNames = Arrays.asList(new String[]{"1.jpg","2.jpg"});
    List<String> contentTypes = Arrays.asList(new String[]{MediaType.IMAGE_JPEG_VALUE,MediaType.IMAGE_JPEG_VALUE});
    List<Byte[]> imagesData = new ArrayList<Byte[]>();
    imagesData.add(ArrayUtils.toObject(IOUtils.toByteArray(getClass().getResourceAsStream("/images/1.jpg"))));
    imagesData.add(ArrayUtils.toObject(IOUtils.toByteArray(getClass().getResourceAsStream("/images/2.jpg"))));
    byte[] allImages = getMultipleImageResponse(boundary, imageNames,contentTypes, imagesData);
    final HttpHeaders headers = new HttpHeaders();
    headers.set("Content-Type","multipart/x-mixed-replace; boundary=" + boundary);
    return new ResponseEntity<byte[]>(allImages,headers,HttpStatus.CREATED);
}

private static byte[] getMultipleImageResponse(String boundary, List<String> imageNames, List<String> contentTypes, List<Byte[]> imagesData){
    byte[] finalByteArray = new byte[0];
    Integer imagesCounter = -1;
    for(String imageName : imageNames){
        imagesCounter++;
        String header="--" + boundary 
                + "\r\nContent-Disposition: form-data; name=\"" + imageName
                + "\"; filename=\"" + imageName + "\"\r\n"
                + "Content-type: " + contentTypes.get(imagesCounter) + "\r\n\r\n";
        byte[] currentImageByteArray=ArrayUtils.addAll(header.getBytes(), ArrayUtils.toPrimitive(imagesData.get(imagesCounter)));
        finalByteArray = ArrayUtils.addAll(finalByteArray,ArrayUtils.addAll(currentImageByteArray, "\r\n\r\n".getBytes()));
        if (imagesCounter == imageNames.size() - 1) {
            String end = "--" + boundary + "--";
            finalByteArray = ArrayUtils.addAll(finalByteArray, end.getBytes());
        }
    }
    return finalByteArray;
}

您应该根据消费者的能力来实现这一点。如果消费者可以解析多部分响应,请继续使用此方法,否则请考虑其他选项,如

  1. 发送所有图片的压缩文件
  2. 返回图像名称的json / xml以及下载它们的URL
  3. 使用Base64编码的字符串
  4. 返回包含所有图像的json / xml

    您还可以使用以下代码发送包含嵌入其中所有图片的html回复。这应该适用于所有浏览器,因为它是纯HTML。

    public ResponseEntity<byte[]> getAllImages() throws IOException {
        List<String> imageNames = Arrays.asList(new String[]{"1.jpg","2.jpg"});
        List<String> contentTypes = Arrays.asList(new String[]{MediaType.IMAGE_JPEG_VALUE,MediaType.IMAGE_JPEG_VALUE});
        List<Byte[]> imagesData = new ArrayList<Byte[]>();
        imagesData.add(ArrayUtils.toObject(IOUtils.toByteArray(getClass().getResourceAsStream("/images/1.jpg"))));
        imagesData.add(ArrayUtils.toObject(IOUtils.toByteArray(getClass().getResourceAsStream("/images/2.jpg"))));
        byte[] htmlData=getHtmlData(imageNames,contentTypes, imagesData);
        final HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.TEXT_HTML);
        return new ResponseEntity<byte[]>(htmlData,headers,HttpStatus.OK);
    }
    
    private static byte[] getHtmlData(List<String> imageNames, List<String> contentTypes, List<Byte[]> imagesData){
        String htmlContent="<!DOCTYPE html><html><head><title>Images</title></head><body>";
         Integer imagesCounter = -1;
        for(String imageName : imageNames){
             imagesCounter++;
            htmlContent = htmlContent + "<br/><br/><b>" + imageName + "</b><br/></br/><img src='data:" + contentTypes.get(imagesCounter) + ";base64, " + org.apache.commons.codec.binary.StringUtils.newStringUtf8(Base64
                    .encodeBase64(ArrayUtils.toPrimitive(imagesData.get(imagesCounter)))) + "'/>";
        }
        htmlContent = htmlContent + "</body></html>";
        return htmlContent.getBytes();
    }
    

答案 1 :(得分:0)

你应该看看&#34;正在上传文件&#34; Spring Boot指南https://spring.io/guides/gs/uploading-files/

上传和下载的示例。