获取https网络图片,并压缩为base64传输(绕过ssl证书)

一.先绕过ssl证书,获取为base64编码格式

代码如下:

 //https的
    public static String httpsRequest(String requestUrl, String requestMethod, String outputStr) {

        // StringBuffer buffer = new StringBuffer();
        byte[] data = null;

        try {
            // 创建SSLContext对象,并使用我们指定的信任管理器初始化
            TrustManager[] tm = {new MyX509TrustManager()};
            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
            sslContext.init(null, tm, new java.security.SecureRandom());
            // 从上述SSLContext对象中得到SSLSocketFactory对象
            SSLSocketFactory ssf = sslContext.getSocketFactory();

            URL url = new URL(requestUrl);
            HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
            httpUrlConn.setSSLSocketFactory(ssf);

            httpUrlConn.setDoOutput(true);
            httpUrlConn.setDoInput(true);
            httpUrlConn.setUseCaches(false);
            // 设置请求方式(GET/POST)
            httpUrlConn.setRequestMethod(requestMethod);

            if ("GET".equalsIgnoreCase(requestMethod))
                httpUrlConn.connect();

            // 当有数据需要提交时
            if (null != outputStr) {
                OutputStream outputStream = httpUrlConn.getOutputStream();
                // 注意编码格式,防止中文乱码
                outputStream.write(outputStr.getBytes("UTF-8"));
                outputStream.close();
            }

            // 将返回的输入流转换成字符串
            InputStream inputStream = httpUrlConn.getInputStream();
            // InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
            // BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            byte[] buffers = new byte[1024];
            //每次读取的字符串长度,如果为-1,代表全部读取完毕
            int len = 0;
            while ((len = inputStream.read(buffers)) != -1) {
                outStream.write(buffers, 0, len);
            }
            inputStream.close();
            data = outStream.toByteArray();

            // 释放资源
            inputStream.close();
            inputStream = null;
            httpUrlConn.disconnect();
            //jsonObject = JSONObject.fromObject(buffer.toString());
        } catch (Exception ce) {
            System.out.println(ce.getMessage());
        }

        Base64Encoder encoder = new Base64Encoder();
        if (data == null) {
            return " ";
        }
        return encoder.encode(data);

    }


    public static class MyX509TrustManager implements X509TrustManager {

        // 检查客户端证书
        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        }

        // 检查服务器端证书
        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        }

        // 返回受信任的X509证书数组
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    }

二.将Base64压缩到40K以下,用于网络传输。

代码如下:

package com.xr.haikang.Base64Util;

import cn.hutool.core.img.ImgUtil;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.math.BigDecimal;


/**
 * Created in 2021/7/14 10:23
 * 图片相关工具类
 * @author
 */
public class ImageUtil {
    /**
     * 计算图片的大小,返回单位为KB
     * @param imageBase64Str 图片base64数据
     * @return 图片大小
     */
    public static Integer imageSize(String imageBase64Str){

        //1.找到等号,把等号也去掉(=用来填充base64字符串长度用)
        Integer equalIndex= imageBase64Str.indexOf("=");
        if(imageBase64Str.indexOf("=")>0) {
            imageBase64Str=imageBase64Str.substring(0, equalIndex);
        }
        //2.原来的字符流大小,单位为字节
        Integer strLength=imageBase64Str.length();
        System.out.println("imageBase64Str Length = "+strLength);
        //3.计算后得到的文件流大小,单位为字节
        Integer size=strLength-(strLength/8)*2;
        return bytesToKB(size);
    }

    /**
     * byte(字节)根据长度转成kb(千字节)
     * @param bytes
     * @return
     */
    public static  Integer bytesToKB(long bytes) {
        BigDecimal filesize = new BigDecimal(bytes);
        BigDecimal megabyte = new BigDecimal(1024 * 1024);
        BigDecimal kilobyte = new BigDecimal(1024);
        float returnValue = filesize.divide(kilobyte, 1, BigDecimal.ROUND_DOWN).floatValue();
        return (int)returnValue ;
    }

    /**
     * 根据图片的base64数据缩放图片
     * @param base64ImagStr 原图的base64字符换
     * @param imageType 图片类型
     * @return
     */
    public static String scaleImage(String base64ImagStr,String imageType){
        BufferedImage bufferedImage = ImgUtil.toImage(base64ImagStr);
        // 这块也可以直接通过传入一个image对象,
        Image scaleImage = ImgUtil.scale(bufferedImage, 0.2f);
        String resultBase64Str = ImgUtil.toBase64(scaleImage, imageType);

        Integer imageSizeBase64 = imageSize(resultBase64Str);
        if(imageSizeBase64 > 40){
            scaleImage(resultBase64Str,imageType);
        }
        return resultBase64Str;

    }


}

三.main方法汇总测试

代码如下:

  public static void main(String[] args) {
        String httpsRequest = httpsRequest("https://xxx:xxx/pic?ad96=d692ide-=o4d19p65c3f995-dcf3489b4*3d4*=119==spt**6210=0065931*2322=8l6*1539=9o86d-11*le9-od27ca657427&AccessKeyId=bqlePDrAQ3ieAHT0&Expires=1660121421&Signature=1fHpHXkr5f5JQrJj5vY/MJZA0/k=", "GET", null);

        String scaleImage = ImageUtil.scaleImage(httpsRequest, "jpg");

        File file = new File("D://base64.txt");

//        String resizeImageTo40K = Base64Util.resizeImageTo40K(str);

        try {
            FileWriter fileOutputStream = new FileWriter(file);

            fileOutputStream.write("data:image/png;base64," + scaleImage);

        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

//        System.out.println(httpsRequest);
    }

猜你喜欢

转载自blog.csdn.net/seeblood/article/details/126265779