需求是把服务器的图片链接或者网上的图片链接地址转为base64位编码方便前端操作文章来源:https://www.toymoban.com/news/detail-522288.html
建议使用方法一
base64编码转为图片在线网址
https://imgtobase64.d777.com/文章来源地址https://www.toymoban.com/news/detail-522288.html
方法一:使用hutool的HttpResponse方法
1.1 引入依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.22</version>
</dependency>
1.2 代码
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import sun.misc.BASE64Encoder;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @Author ekkcole
* @remark 图片链接转为base64编码
*/
public class UrlToBase64Util {
//base64前缀
private static final String BASE64_PREFIX="data:image/png;base64,";
public static void main(String[] args) throws Exception {
String url="https://localhost:8080/upload/file/20221101/test.png";
System.out.println(BASE64_PREFIX+imageUrlToBase64(url));
}
/**
* 图片URL转Base64编码
*
* @param imgUrl 图片URL
* @return Base64编码
*/
public static String imageUrlToBase64(String imgUrl) {
InputStream is = null;
ByteArrayOutputStream outStream = null;
try {
if (!ObjectUtils.isEmpty(imgUrl)) {
HttpResponse res = HttpRequest.get(imgUrl).execute();
// 获取输入流
is = res.bodyStream();
outStream = new ByteArrayOutputStream();
//创建一个Buffer字符串
byte[] buffer = new byte[1024];
//每次读取的字符串长度,如果为-1,代表全部读取完毕
int len = 0;
//使用输入流从buffer里把数据读取出来
while ((len = is.read(buffer)) != -1) {
//用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
outStream.write(buffer, 0, len);
}
// 对字节数组Base64编码
return encode(outStream.toByteArray());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
}
if (outStream != null) {
outStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
/**
* 图片转字符串
*
* @param image 图片Buffer
* @return Base64编码
*/
public static String encode(byte[] image) {
BASE64Encoder decoder = new BASE64Encoder();
return replaceEnter(decoder.encode(image));
}
/**
* 字符替换
*
* @param str 字符串
* @return 替换后的字符串
*/
public static String replaceEnter(String str) {
String reg = "[\n-\r]";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(str);
return m.replaceAll("");
}
}
方法二:使用自带的请求,有的网址会报错,建议用第一种
import org.springframework.util.ObjectUtils;
import sun.misc.BASE64Encoder;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class UrlToBase64 {
//base64前缀
private static final String BASE64_PREFIX="data:image/png;base64,";
public static void main(String[] args) throws Exception {
String url="https://localhost:8080/upload/file/20221101/test.png";
System.out.println(BASE64_PREFIX+imageUrlToBase64(url));
}
/**
* 图片URL转Base64编码
* @param imgUrl 图片URL
* @return Base64编码
*/
public static String imageUrlToBase64(String imgUrl) {
URL url = null;
InputStream is = null;
ByteArrayOutputStream outStream = null;
HttpURLConnection httpUrl = null;
try {
if (!ObjectUtils.isEmpty(imgUrl)) {
// 如果服务器图片地址带有中文,最好处理一下
String[] argss = imgUrl.split("/");
String name1 = argss[argss.length - 1];
String name2 = java.net.URLEncoder.encode(name1, "utf-8");
// 处理中文名
String newUrl = imgUrl.replace(name1, name2);
url = new URL(newUrl);
httpUrl = (HttpURLConnection) url.openConnection();
httpUrl.connect();
httpUrl.getInputStream();
is = httpUrl.getInputStream();
outStream = new ByteArrayOutputStream();
//创建一个Buffer字符串
byte[] buffer = new byte[1024];
//每次读取的字符串长度,如果为-1,代表全部读取完毕
int len = 0;
//使用输入流从buffer里把数据读取出来
while ((len = is.read(buffer)) != -1) {
//用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
outStream.write(buffer, 0, len);
}
// 对字节数组Base64编码
return encode(outStream.toByteArray());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(is != null) {
is.close();
}
if(outStream != null) {
outStream.close();
}
if(httpUrl != null) {
httpUrl.disconnect();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
/**
* 图片转字符串
* @param image 图片Buffer
* @return Base64编码
*/
public static String encode(byte[] image){
BASE64Encoder decoder = new BASE64Encoder();
return replaceEnter(decoder.encode(image));
}
/**
* 字符替换
* @param str 字符串
* @return 替换后的字符串
*/
public static String replaceEnter(String str){
String reg ="[\n-\r]";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(str);
return m.replaceAll("");
}
}
到了这里,关于java使用hutool把服务器图片链接转为base64编码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!