问题场景是使用BASE64Encoder().encode(data)将图片转换成base后在本地调试是可以稳定运行的,与前端联调也是没有问题的,但是将服务部署到服务器在页面访问的时候就一直出现转换的图片格式不对的问题,因为BASE64Encoder().encode(data)转换的图片base会有空格什么的,因此也加上了 base64 = base64.replaceAll("\\r\\n","");替换,但是问题依旧没有解决。网上查到的是和base64和BASE64Encoder的区别是加密方式的不同,还有就是转换base64后者出现多余的换行符合空格的问题。感觉问题很奇怪。换成Base64.encodeBase64String(data);后问题解决。
//imagesBase64为远程网络图片地址--url private String judgPicType(String imagesBase64) { //将图片文件转化为字节数组字符串,并对其进行Base64编码处理 try { URL url = new URL(imagesBase64); //打开链接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //设置请求方式为"GET" conn.setRequestMethod("GET"); //超时响应时间为5秒 conn.setConnectTimeout(5 * 1000); //通过输入流获取图片数据 InputStream inStream = conn.getInputStream(); //得到图片的二进制数据,以二进制封装得到数据,具有通用性 ByteArrayOutputStream outStream = new ByteArrayOutputStream(); //创建一个Buffer字符串 byte[] buffer = new byte[1024]; //每次读取的字符串长度,如果为-1,代表全部读取完毕 int len = 0; //使用一个输入流从buffer里把数据读取出来 while ((len = inStream.read(buffer)) != -1) { //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度 outStream.write(buffer, 0, len); } //关闭输入流 inStream.close(); byte[] data = outStream.toByteArray(); //对字节数组Base64编码 String base64 = Base64.encodeBase64String(data); // BASE64Encoder encoder = new BASE64Encoder(); // String base64 = encoder.encode(data); // base64 = base64.replaceAll("\\r\\n",""); return base64; } catch (IOException e) { throw BaseException.of(VehicleErrorCode.PARAM_ERROR.of(), "根据图片转base64异常" + e); } }
通过查源码推测感觉是编码方式的问题,浏览器与本地服务的编码一样导致。base64采用的是
Charsets.US_ASCII
而BASE64Encoder采用的是8859_1