171 lines
5.9 KiB
Java
171 lines
5.9 KiB
Java
package com.zhgd.xmgl.util;
|
||
|
||
import cn.hutool.core.io.FileUtil;
|
||
import lombok.extern.slf4j.Slf4j;
|
||
import org.apache.commons.codec.binary.Base64;
|
||
|
||
import java.io.*;
|
||
import java.net.HttpURLConnection;
|
||
import java.net.URL;
|
||
import java.util.HashMap;
|
||
import java.util.Map;
|
||
|
||
@Slf4j
|
||
public class Base64Util {
|
||
// 文件扩展名 -> MIME类型映射
|
||
private static final Map<String, String> MIME_TYPES = new HashMap<>();
|
||
|
||
static {
|
||
// 图片
|
||
MIME_TYPES.put(".jpg", "image/jpeg");
|
||
MIME_TYPES.put(".jpeg", "image/jpeg");
|
||
MIME_TYPES.put(".png", "image/png");
|
||
MIME_TYPES.put(".gif", "image/gif");
|
||
MIME_TYPES.put(".bmp", "image/bmp");
|
||
MIME_TYPES.put(".webp", "image/webp");
|
||
|
||
// 文档
|
||
MIME_TYPES.put(".pdf", "application/pdf");
|
||
MIME_TYPES.put(".txt", "text/plain");
|
||
|
||
// Office
|
||
MIME_TYPES.put(".doc", "application/msword");
|
||
MIME_TYPES.put(".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
|
||
MIME_TYPES.put(".xls", "application/vnd.ms-excel");
|
||
MIME_TYPES.put(".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
||
MIME_TYPES.put(".ppt", "application/vnd.ms-powerpoint");
|
||
MIME_TYPES.put(".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation");
|
||
|
||
// 压缩包
|
||
MIME_TYPES.put(".zip", "application/zip");
|
||
MIME_TYPES.put(".rar", "application/x-rar-compressed");
|
||
MIME_TYPES.put(".7z", "application/x-7z-compressed");
|
||
}
|
||
|
||
public static String getURLImage(String imageUrl) {
|
||
String base64String = "";
|
||
try {
|
||
//new一个URL对象
|
||
URL url = new URL(imageUrl);
|
||
//打开链接
|
||
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
||
//设置请求方式为"GET"
|
||
conn.setRequestMethod("GET");
|
||
//超时响应时间为5秒
|
||
conn.setConnectTimeout(20 * 1000);
|
||
conn.setReadTimeout(20 * 1000);
|
||
//通过输入流获取图片数据
|
||
InputStream inStream = conn.getInputStream();
|
||
//得到图片的二进制数据,以二进制封装得到数据,具有通用性
|
||
byte[] data = readInputStream(inStream);
|
||
base64String = Base64.encodeBase64String(data);
|
||
|
||
} catch (Exception e) {
|
||
log.error("error:", e);
|
||
}
|
||
return base64String;
|
||
}
|
||
|
||
/**
|
||
* 本地文件(图片、excel等)转换成Base64字符串
|
||
*
|
||
* @param imgPath
|
||
*/
|
||
public static String convertFileToBase64(String imgPath) {
|
||
byte[] fileBytes = FileUtil.readBytes(imgPath);
|
||
return Base64.encodeBase64String(fileBytes);
|
||
}
|
||
|
||
/**
|
||
* 本地文件(图片、excel等)转换成Base64字符串(带前缀)
|
||
*
|
||
* @param filePath
|
||
* @return
|
||
*/
|
||
public static String convertFileToBase64WithPrefix(String filePath) {
|
||
String base64 = convertFileToBase64(filePath);
|
||
String fileExt = getFileExtension(filePath).toLowerCase();
|
||
|
||
// 获取对应的MIME类型,默认使用application/octet-stream
|
||
String mimeType = MIME_TYPES.getOrDefault(fileExt, "application/octet-stream");
|
||
return "data:" + mimeType + ";base64," + base64;
|
||
}
|
||
|
||
/**
|
||
* 获取文件扩展名(带点)
|
||
*/
|
||
private static String getFileExtension(String filename) {
|
||
int dotIndex = filename.lastIndexOf('.');
|
||
return (dotIndex == -1) ? "" : filename.substring(dotIndex);
|
||
}
|
||
|
||
public static String getFileToBase64(String imgPath) {
|
||
if (imgPath.indexOf("http") >= 0) {
|
||
return getURLImage(imgPath);
|
||
} else {
|
||
return convertFileToBase64(imgPath);
|
||
}
|
||
}
|
||
|
||
private static byte[] readInputStream(InputStream inStream) throws Exception {
|
||
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();
|
||
//把outStream里的数据写入内存
|
||
return outStream.toByteArray();
|
||
}
|
||
|
||
|
||
public static File convertBase64ToFile(String fileBase64String, String filePath, String fileName) {
|
||
BufferedOutputStream bos = null;
|
||
FileOutputStream fos = null;
|
||
File file;
|
||
try {
|
||
File dir = new File(filePath);
|
||
// 判断文件目录是否存在
|
||
if (!dir.exists()) {
|
||
FileUtil.mkdir(dir);
|
||
}
|
||
java.util.Base64.Decoder decoder = java.util.Base64.getMimeDecoder();
|
||
|
||
//BASE64Decoder decoder = new BASE64Decoder();
|
||
//byte[] bfile = decoder.decodeBuffer(fileBase64String);
|
||
byte[] bfile = decoder.decode(fileBase64String);
|
||
file = new File(filePath + File.separator + fileName);
|
||
fos = new FileOutputStream(file);
|
||
bos = new BufferedOutputStream(fos);
|
||
bos.write(bfile);
|
||
return file;
|
||
} catch (Exception e) {
|
||
log.error("error:", e);
|
||
return null;
|
||
} finally {
|
||
if (bos != null) {
|
||
try {
|
||
bos.close();
|
||
} catch (IOException e1) {
|
||
e1.printStackTrace();
|
||
}
|
||
}
|
||
if (fos != null) {
|
||
try {
|
||
fos.close();
|
||
} catch (IOException e1) {
|
||
e1.printStackTrace();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
}
|