一.先绕过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);
}