171 lines
5.9 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
}
}
}
}
}