package com.ruoyi.web.controller.tool;
|
|
import com.ruoyi.common.config.RuoYiConfig;
|
import com.ruoyi.common.utils.file.FileUtils;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.codec.binary.Base64;
|
import org.springframework.stereotype.Component;
|
import org.springframework.util.StringUtils;
|
|
import java.io.ByteArrayOutputStream;
|
import java.io.File;
|
import java.io.FileInputStream;
|
import java.io.InputStream;
|
import java.net.HttpURLConnection;
|
import java.net.URL;
|
import java.nio.file.Files;
|
|
@Slf4j
|
@Component
|
public class ImageUtil {
|
|
/**
|
* 将网络图片URL转为Base64编码
|
*
|
* @param imageUrl 网络图片地址
|
* @return Base64编码的图片字符串
|
*/
|
public static String imageUrlToBase64(String imageUrl) {
|
if (StringUtils.isEmpty(imageUrl)) {
|
return null;
|
}
|
|
String imagePath = RuoYiConfig.getUploadPath() + imageUrl.replace("/profile/upload", "");
|
|
InputStream inputStream = null;
|
ByteArrayOutputStream outputStream = null;
|
|
try {
|
// 1. 获取本地文件
|
File imageFile = new File(imagePath);
|
if (!imageFile.exists()) {
|
log.error("图片文件不存在:{}", imagePath);
|
return null;
|
}
|
|
// 2. 读取图片数据
|
inputStream = Files.newInputStream(imageFile.toPath());
|
outputStream = new ByteArrayOutputStream();
|
|
byte[] buffer = new byte[8192];
|
int len;
|
while ((len = inputStream.read(buffer)) != -1) {
|
outputStream.write(buffer, 0, len);
|
}
|
|
// 3. 转换为Base64
|
byte[] imageBytes = outputStream.toByteArray();
|
String base64 = Base64.encodeBase64String(imageBytes);
|
|
// 4. 根据文件扩展名添加前缀
|
String contentType = getContentType(imagePath);
|
return "data:" + contentType + ";base64," + base64;
|
|
} catch (Exception e) {
|
log.error("本地图片转Base64失败,路径:{}", imagePath, e);
|
return null;
|
} finally {
|
try {
|
if (inputStream != null) {
|
inputStream.close();
|
}
|
if (outputStream != null) {
|
outputStream.close();
|
}
|
} catch (Exception e) {
|
log.error("关闭流失败", e);
|
}
|
}
|
}
|
|
/**
|
* 根据文件扩展名获取Content-Type
|
*/
|
private static String getContentType(String imagePath) {
|
if (StringUtils.isEmpty(imagePath)) {
|
return "image/jpeg";
|
}
|
String ext = imagePath.substring(imagePath.lastIndexOf(".") + 1).toLowerCase();
|
switch (ext) {
|
case "png":
|
return "image/png";
|
case "gif":
|
return "image/gif";
|
case "bmp":
|
return "image/bmp";
|
case "webp":
|
return "image/webp";
|
case "svg":
|
return "image/svg+xml";
|
case "jpg":
|
case "jpeg":
|
default:
|
return "image/jpeg";
|
}
|
}
|
}
|