public class Base64Utils {
public static byte[] base64ToByte(String imageBase64) {
byte[] b = null;
Base64.Decoder decoder = Base64.getDecoder();
try {
if (imageBase64.indexOf("data:image/jpeg;base64,") != -1) {
b = decoder.decode(imageBase64.replaceAll("data:image/jpeg;base64,", ""));
} else {
if (imageBase64.indexOf("data:image/png;base64,") != -1) {
b = decoder.decode(imageBase64.replaceAll("data:image/png;base64,", ""));
} else {
b = decoder.decode(imageBase64.replaceAll("data:image/jpg;base64,", ""));
}
}
for (int i = 0; i < b.length; ++i) {
if (b[i] < 0) {// 调整异常数据
b[i] += 256;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return b;
}
public static String filePath( byte[] b) {
String imgPath = null; //最终返回的图片路径
String saveUrl = null;
try {
//为了避免重复,图片名字改成 用户名+当前时间+图片格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String fileAdd = sdf.format(new Date()); //当前时间
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
String ymd = sdf1.format(new Date());
//图片存储路径
//如果要存到当前项目路径下就用这个
String resourcesPath = "E:\\upload\\infile\\attached\\"+ymd+ "/";
// 自定义路径
// String resourcesPath = request.getServletContext().getRealPath("/") + "upload/infile/attached/";
//做转码,否则存的图片名字会乱码
resourcesPath = URLDecoder.decode(resourcesPath, "UTF-8");
//图片名称是 当前日期 + 随机数 避免数据重复
String fileName = fileAdd + new Random().nextInt(1000) + ".jpeg";
//用于写入的图片路径
String Path = resourcesPath + fileName;
//如果自定义路径,首先判断路径是否存在
File directory = new File(resourcesPath);
if(!directory.exists()){
directory.mkdir();
}
//如果文件夹不存在则创建
File file = new File(Path);
if (!file.exists()) {
file.createNewFile();
}
//将二进制在转换为图片
OutputStream out = new FileOutputStream(Path);
out.write(b);
out.flush();
out.close();
imgPath = fileName;
saveUrl = Path.substring(Path.indexOf("upload"));
} catch (Exception e) {
imgPath = null;
e.printStackTrace();
}
return saveUrl;
}
public static String image2Base64(String imgUrl) {
URL url = null;
InputStream is = null;
ByteArrayOutputStream outStream = null;
HttpURLConnection httpUrl = null;
try{
url = new URL(imgUrl);
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 encodeImage(outStream.toByteArray());
}catch (Exception e) {
e.printStackTrace();
}
finally{
if(is != null)
{
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(outStream != null)
{
try {
outStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(httpUrl != null)
{
httpUrl.disconnect();
}
}
return imgUrl;
}
public static String encodeImage(byte[] image){
BASE64Encoder decoder = new BASE64Encoder();
return replaceEnter(decoder.encode(image));
}
public static String replaceEnter(String str){
String reg ="[\n-\r]";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(str);
return m.replaceAll("");
}
/**
* 图片url转成Base64存服务器上返回图片路径
* @param url
* @return
*/
public static String imgUrlSave(String url){
String base64 = image2Base64(url);
String s = filePath(base64ToByte(base64));
return s;
}
public static void main(String[] args) {
System.out.println(imgUrlSave("https://img-home.csdnimg.cn/images/20201124032511.png"));
}
}
java 图片url转成Base64并存服务器上返回图片路径
最新推荐文章于 2024-08-23 14:24:12 发布