从 Web 服务 SPRINGBOOT+REST+MAVEN 发送多张图像 [英] Sending Multiple images from web service SPRINGBOOT+REST+MAVEN

查看:49
本文介绍了从 Web 服务 SPRINGBOOT+REST+MAVEN 发送多张图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am writing a web service in spring boot restful web App using which i am sending a image to anyone who wants to consume it below is a code snippet which worked for me

@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 服务可以正常工作

This web service works perfectly fine in case i want to return a single image from a web service

但是如果我想返回图像数组(即超过 1 个图像)怎么办

But what if in case i want to return array of images(i.e. more than 1 image)

非常感谢任何帮助.

问候,

推荐答案

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

Here's the sample code that I wrote to generate a multipart response with multiple images in it. It's properly consumed by Firefox and it prompts to save each image in the response.

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

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

You should implement this depending on the capability of the consumer. If the consumer can parse multipart response, please go ahead with this approach, else consider other options like

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

您还可以使用以下代码发送一个 html 响应,其中嵌入了所有图像.这应该适用于所有浏览器,因为它是纯 html.

You may also send a html response with all images embedded in it using the below code. This should work fine in all browsers as it is pure 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();
}

这篇关于从 Web 服务 SPRINGBOOT+REST+MAVEN 发送多张图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆