简体   繁体   English

将Base64编码的字节[]作为JSON MIME类型传递

[英]Pass Base64 encoded byte [] as a JSON MIME Type

I have a REST service which @Produces(MediaType.APPLICATION_JSON) . 我有一个@Produces(MediaType.APPLICATION_JSON)的REST服务。 In the REST service, I have created an Image of type BufferedImage and then writing it to ImageIO as a png image. 在REST服务中,我创建了一个BufferedImage类型的Image,然后将其作为png图像写入ImageIO Next, I am encoding this Image as Base64 encoded string. 接下来,我将此图像Base64 encodedBase64 encoded字符串。 Now I need to return this encoded string in JSON Format and then at the Client side I need to use the Base64 string in img tag as below : 现在,我需要以JSON格式返回此编码字符串,然后在客户端,需要在img标签中使用Base64字符串,如下所示:

<img id="captchaImage" src="data:image/png;base64,<%=Base64ImageString%>"/>

How I can pass the Base64 as MediaType.APPLICATION_JSON 如何将Base64作为MediaType.APPLICATION_JSON传递

Code : 代码:

import java.awt.Color;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Base64;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

@RestService
@Named("CaptchaServlet")
@Path("/reCaptchaImg")
@Produces(MediaType.APPLICATION_JSON)
public class CaptchaServlet implements ICaptchaServlet{

    @Override
    public Response processRequest(HttpServletRequest request) throws GeneralSecurityException, IOException {
        try {
        System.out.println("shaan Inside processRequest");
        int width = 150;
        int height = 50;

        //Random string generation happens
        Random r = new Random();
        int length = 6;
        System.out.println("shaan Creating string parameter");
        StringBuffer captchaStringBuffer = new StringBuffer();
        for (int i = 0; i < length; i++) {
            int baseCharNumber = ((r.nextInt((500-1)+1)+1) % 62);
            int charNumber = 0;
            if (baseCharNumber < 26) {
              charNumber = 65 + baseCharNumber;
            }
            else if (baseCharNumber < 52){
              charNumber = 97 + (baseCharNumber - 26);
            }
            else {
              charNumber = 48 + (baseCharNumber - 52);
            }
            captchaStringBuffer.append((char)charNumber);
        }
        String captchaString = captchaStringBuffer.toString();
        System.out.println("The random string generated is : "+captchaString);

        char[] s3 = captchaString.toCharArray();
        System.out.println("shaan1");

        //Converting Captcha String to Image
        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = bufferedImage.createGraphics();
        System.out.println("shaan2");
        Font font = new Font("Georgia", Font.BOLD, 18);
        g2d.setFont(font);
        System.out.println("shaan3");
        RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        System.out.println("shaan4");
        rh.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        g2d.setRenderingHints(rh);
        System.out.println("shaan5");
        GradientPaint gp = new GradientPaint(0, 0, Color.red, 0, height / 2, Color.black, true);
        g2d.setPaint(gp);
        g2d.fillRect(0, 0, width, height);
        g2d.setColor(new Color(255, 153, 0));
        System.out.println("shaan6");
        String captcha = String.copyValueOf(s3);
        System.out.println("shaan7");
        int x = 0;
        int y = 0;
        for (int i = 0; i < s3.length; i++) {
            x += 10 + (Math.abs(r.nextInt()) % 15);
            y = 20 + Math.abs(r.nextInt()) % 20;
            g2d.drawChars(s3, i, 1, x, y);
        }
        g2d.dispose();
        System.out.println("shaan8");
        System.out.println("shaan9");

        //Sending Image in output
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(bufferedImage, "png", baos);
        byte[] imageData = baos.toByteArray();
        System.out.println("shaan10" + captcha);
        request.getSession().setAttribute("captcha", captcha);
        System.out.println("shaan11");
        baos.flush();
        baos.close();
        System.out.println("shaan12");
        System.out.println("The imageData is :"+imageData);

        //Encoding to Base64
        byte[] encoded = Base64.getEncoder().encode(imageData);
        System.out.println("The encoded is :"+encoded);
        return Response.ok(encoded, MediaType.APPLICATION_JSON).build();
        }catch (IOException e) {
            // TODO Auto-generated catch block
            System.out.println("In Error Catch block");
            e.printStackTrace();
            return Response.status(Status.BAD_REQUEST).build();
        }
}

Just for reference the output of the lines in the code is : 仅供参考,代码中各行的输出为:

System.out.println("The imageData is :"+imageData);
The imageData is :[B@238bbb96

System.out.println("The encoded is :"+encoded);
The encoded is :[B@1a477e17

I think what you are trying to do can't work it also it doesn't make sense for me. 我认为您尝试做的事情行不通,对我来说也没有意义。

Data-URIs are meant to have the data for the image directly inside the HTML, not to be linked from external URLs. 数据URI的意思是直接在HTML内部包含图像的数据,而不是从外部URL进行链接。

You should just return the image without encoding it to Base64 and link it directly. 您应该只返回图像而不将其编码为Base64并将其直接链接。

You could change your code to this: 您可以将代码更改为此:

import java.awt.Color;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

@Named("CaptchaServlet")
@Path("/reCaptchaImg")
@Produces("image/png")
public class CaptchaServlet {

    @GET
    public Response processRequest(@Context HttpServletRequest request) {
        try {
            System.out.println("shaan Inside processRequest");
            int width = 150;
            int height = 50;

            //Random string generation happens
            Random r = new Random();
            int length = 6;
            System.out.println("shaan Creating string parameter");
            StringBuffer captchaStringBuffer = new StringBuffer();
            for (int i = 0; i < length; i++) {
                int baseCharNumber = ((r.nextInt((500 - 1) + 1) + 1) % 62);
                int charNumber = 0;
                if (baseCharNumber < 26) {
                    charNumber = 65 + baseCharNumber;
                } else if (baseCharNumber < 52) {
                    charNumber = 97 + (baseCharNumber - 26);
                } else {
                    charNumber = 48 + (baseCharNumber - 52);
                }
                captchaStringBuffer.append((char) charNumber);
            }
            String captchaString = captchaStringBuffer.toString();
            System.out.println("The random string generated is : " + captchaString);

            char[] s3 = captchaString.toCharArray();
            System.out.println("shaan1");

            //Converting Captcha String to Image
            BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            Graphics2D g2d = bufferedImage.createGraphics();
            System.out.println("shaan2");
            Font font = new Font("Georgia", Font.BOLD, 18);
            g2d.setFont(font);
            System.out.println("shaan3");
            RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            System.out.println("shaan4");
            rh.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
            g2d.setRenderingHints(rh);
            System.out.println("shaan5");
            GradientPaint gp = new GradientPaint(0, 0, Color.red, 0, height / 2, Color.black, true);
            g2d.setPaint(gp);
            g2d.fillRect(0, 0, width, height);
            g2d.setColor(new Color(255, 153, 0));
            System.out.println("shaan6");
            String captcha = String.copyValueOf(s3);
            System.out.println("shaan7");
            int x = 0;
            int y = 0;
            for (int i = 0; i < s3.length; i++) {
                x += 10 + (Math.abs(r.nextInt()) % 15);
                y = 20 + Math.abs(r.nextInt()) % 20;
                g2d.drawChars(s3, i, 1, x, y);
            }
            g2d.dispose();
            System.out.println("shaan8");
            System.out.println("shaan9");

            //Sending Image in output
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(bufferedImage, "png", baos);
            byte[] imageData = baos.toByteArray();
            System.out.println("shaan10" + captcha);
            request.getSession(true).setAttribute("captcha", captcha);
            System.out.println("shaan11");
            baos.flush();
            baos.close();
            System.out.println("The imageData is :" + imageData);

            return Response.ok(imageData, "image/png").build();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            System.out.println("In Error Catch block");
            e.printStackTrace();
            return Response.status(Status.BAD_REQUEST).build();
        }
    }
}

Then you can use the image like this: 然后,您可以使用如下图像:

<!DOCTYPE html>
<html>
    <body>
        <h1>Hello World!</h1>
        <img id="captchaImage" alt="muh" src="/YOUR_REST_PATH/reCaptchaImg"/>
    </body>
</html>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM