java-从网络URL中读取图片转换成Base64字符串-靠谱版

刚开始开始参考了两篇文章:
http://blog.csdn.net/simba_cheng/article/details/52295169
http://blog.csdn.net/hfhwfw/article/details/5544408
发现生成的Base64字符串转换为本地图片有如下问题:

 

很明显只能显示一部分,而且BASE64Encoder报错,找不到jar包,原因是Base64Encoder并不属于JDK标准库范畴,但是又包含在了JDK中,这个问题解决方案如下:

设置Eclipse导入%JAVA_HOME%\jre\lib目录下的rt.jar包即可,Project->Properties,选择Java Build Path设置项,再选择Libraries标签,Add External Jars添加%JAVA_HOME%\jre\lib\rt.jar就可以使用啦!

接下来我们们优化将网络图片编码为base64的方法:

/**
* 将网络图片编码为base64
*
* @param url
* @return
* @throws BusinessException
*/
public static String encodeImageToBase64(URL url) throws Exception {
//将图片文件转化为字节数组字符串,并对其进行Base64编码处理
System.out.println("图片的路径为:" + url.toString());
//打开链接
HttpURLConnection conn = null;
try {
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编码
BASE64Encoder encoder = new BASE64Encoder();
String base64 = encoder.encode(data);
System.out.println("网络文件[{}]编码成base64字符串:[{}]"+url.toString()+base64);
return base64;//返回Base64编码过的字节数组字符串
} catch (IOException e) {
e.printStackTrace();
throw new Exception("图片上传失败,请联系客服!");
}
}

 

经测试,OK,没问题了,完整测试代码如下:

package com.test.main;

import sun.misc.BASE64Encoder;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;

import com.test.util.Base64Util;
public class Test3 {
/**
* 将网络图片编码为base64
*
* @param url
* @return
* @throws BusinessException
*/
public static String encodeImageToBase64(URL url) throws Exception {
//将图片文件转化为字节数组字符串,并对其进行Base64编码处理
System.out.println("图片的路径为:" + url.toString());
//打开链接
HttpURLConnection conn = null;
try {
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编码
BASE64Encoder encoder = new BASE64Encoder();
String base64 = encoder.encode(data);
System.out.println("网络文件[{}]编码成base64字符串:[{}]"+url.toString()+base64);
return base64;//返回Base64编码过的字节数组字符串
} catch (IOException e) {
e.printStackTrace();
throw new Exception("图片上传失败,请联系客服!");
}
}

public static void main(String[] args) throws Exception {
String imgFilePath="http://d.hiphotos.baidu.com/image/pic/item/a044ad345982b2b713b5ad7d3aadcbef76099b65.jpg";
String base64_str = encodeImageToBase64(new URL(imgFilePath));//将网络图片编码为base64
//String base64_str = Base64Util.getImageBinary("D:/test.jpg","jpg");//将本地图片编码为base64
System.out.println(base64_str);
Base64Util.base64StringToFile(base64_str,"E:/out.jpg");
}
}

传送门:

工具类Base64Util.java下载链接:

https://www.yuque.com/xiewenlin/develop-sikll/vo584o

更多最佳实践技术文章

 

 

 

你可能感兴趣的:(java,图片,base64)