最近懒得动,博客很久没更了。
现在很多云服务,图片保存在网络中了。或者对接其他系统,资源也都是拿到的地址。由于我方服务器处理器内存磁盘空间都较小,想直接拿到网络图片地址的base64值。
以前的方法是先把网络图片下载到服务器,然后转base64,耗费服务器资源。弃之!
方法来源于网友,本博客只是收录:
通用方法:
/**
* 将网络图片编码为base64
*
* @param url
* @return
* @throws
*/
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("图片上传失败,请联系客服!");
}
}
调用该方法(转码的base64值不带前缀,需自行添加):
URL url = new URL(user.getPicture());
String base64str=encodeImageToBase64(url);
阿里云的API我用得少,也找了一个,我用永久地址的图片(公共读的bucket)测试发现不行,还没有用私有bucket的图片地址测试,有时间再说,代码见下:
public static String getBase64FromUrl(String imgUrl) throws IOException {
String prfFix = "data:image/" + "jpeg;base64,";
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(bucketName,imgUrl, HttpMethod.GET);
req.setExpiration(new Date(new Date().getTime()+1000L * 60L * 60L));
req.setProcess(prfFix);
URL signedUrl = ossClient.generatePresignedUrl(req);
System.out.println(signedUrl.toString());
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(signedUrl.toString());
HttpResponse response = client.execute(get);
if (response.getStatusLine().getStatusCode() == 200){
HttpEntity entity = response.getEntity();
byte[] data = EntityUtils.toByteArray(entity);
BASE64Encoder encoder = new BASE64Encoder();
String encode = encoder.encode(data);
return encode;
}else {
return null;
}
}