问题描述:将url图片地址转成base64位字节 传输,只传输了部分文件
查找方向:base64转码方法,读取文件字节方法
问题定位:inStream.available()读取文件流长度不不完整,这个方法从本地文件读取数据时一般不会出现问题,但是通过网路传输就会出现图片传输不完整的情况,因为网络通讯是间断性的一串字节往往分几批进行发送。本地程序调用available()方法有时得到0,这可能是对方还没有响应,也可能是对方已经响应了,但是数据还没有送达本地。
代码事例:修改前方法--------
public static String GetUrlImageToBase64(String url) throws Exception {
if (url == null || "".equals(url.trim()))
return null;
URL u = new URL(url); // 打开图片路径
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
// 设置请求方式为GET
conn.setRequestMethod("GET");
// 设置超时响应时间为5秒
conn.setConnectTimeout(5000);
// 通过输入流获取图片数据
InputStream inStream = conn.getInputStream();
// 读取图片字节数组
byte[] data = new byte[inStream.available()];
inStream.read(data);
inStream.close();
// 返回Base64编码过的字节数组字符串
return EncryptUtil.encodeBase64(data,"UTF-8");
}
代码事例:修改后方法--------
public static String GetUrlImageToBase64(String url) throws Exception {
if (url == null || "".equals(url.trim()))
return null;
URL u = new URL(url); // 打开图片路径
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
// 设置请求方式为GET
conn.setRequestMethod("GET");
// 设置超时响应时间为5秒
conn.setConnectTimeout(5000);
// 通过输入流获取图片数据
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);
System.out.println("网络文件转base64"+url.toString()+base64);
return base64;//返回Base64编码过的字节数组字符串
}