1
This commit is contained in:
@@ -2,7 +2,6 @@ package cn.van.business.service;
|
|||||||
|
|
||||||
import cn.van.business.model.pl.ImageConversion;
|
import cn.van.business.model.pl.ImageConversion;
|
||||||
import cn.van.business.repository.ImageConversionRepository;
|
import cn.van.business.repository.ImageConversionRepository;
|
||||||
import cn.hutool.core.io.FileUtil;
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.hutool.http.HttpUtil;
|
import cn.hutool.http.HttpUtil;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -16,9 +15,7 @@ import javax.imageio.ImageReader;
|
|||||||
import javax.imageio.stream.ImageInputStream;
|
import javax.imageio.stream.ImageInputStream;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
@@ -97,22 +94,37 @@ public class ImageConvertService {
|
|||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.info("开始转换图片URL列表,共{}张图片", imageUrls.size());
|
||||||
List<String> convertedUrls = new ArrayList<>();
|
List<String> convertedUrls = new ArrayList<>();
|
||||||
|
int successCount = 0;
|
||||||
|
int skipCount = 0;
|
||||||
|
|
||||||
for (String imageUrl : imageUrls) {
|
for (String imageUrl : imageUrls) {
|
||||||
if (StrUtil.isBlank(imageUrl)) {
|
if (StrUtil.isBlank(imageUrl)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.debug("处理图片URL: {}", imageUrl);
|
||||||
try {
|
try {
|
||||||
String convertedUrl = convertImageUrl(imageUrl);
|
String convertedUrl = convertImageUrl(imageUrl);
|
||||||
|
if (!convertedUrl.equals(imageUrl)) {
|
||||||
|
successCount++;
|
||||||
|
log.debug("图片转换成功: {} -> {}", imageUrl, convertedUrl);
|
||||||
|
} else {
|
||||||
|
skipCount++;
|
||||||
|
log.debug("图片无需转换(非webp格式): {}", imageUrl);
|
||||||
|
}
|
||||||
convertedUrls.add(convertedUrl);
|
convertedUrls.add(convertedUrl);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// 转换失败时使用原URL,不中断流程
|
// 转换失败时使用原URL,不中断流程
|
||||||
|
skipCount++;
|
||||||
log.warn("图片转换失败,使用原URL: {}. 错误: {}", imageUrl, e.getMessage());
|
log.warn("图片转换失败,使用原URL: {}. 错误: {}", imageUrl, e.getMessage());
|
||||||
convertedUrls.add(imageUrl);
|
convertedUrls.add(imageUrl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.info("图片URL转换完成,共{}张,成功转换{}张,跳过/失败{}张",
|
||||||
|
imageUrls.size(), successCount, skipCount);
|
||||||
return convertedUrls;
|
return convertedUrls;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -128,31 +140,59 @@ public class ImageConvertService {
|
|||||||
return originalUrl;
|
return originalUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 规范化URL:处理协议相对URL(//开头)
|
||||||
|
String normalizedUrl = normalizeUrl(originalUrl);
|
||||||
|
|
||||||
// 检查是否为webp格式
|
// 检查是否为webp格式
|
||||||
if (!isWebpFormat(originalUrl)) {
|
if (!isWebpFormat(normalizedUrl)) {
|
||||||
return originalUrl;
|
return originalUrl; // 返回原URL,保持一致性
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查系统是否支持webp转换
|
// 检查系统是否支持webp转换
|
||||||
if (!WebPImageIO.isWebPSupported()) {
|
if (!WebPImageIO.isWebPSupported()) {
|
||||||
log.debug("系统不支持webp格式,跳过转换: {}", originalUrl);
|
log.warn("系统不支持webp格式,跳过转换: {}", normalizedUrl);
|
||||||
throw new IOException("系统不支持webp格式转换");
|
throw new IOException("系统不支持webp格式转换");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查是否已转换
|
// 使用规范化后的URL进行缓存查询和转换
|
||||||
Optional<ImageConversion> existing = imageConversionRepository.findByOriginalUrl(originalUrl);
|
// 检查是否已转换(使用规范化URL作为key)
|
||||||
|
Optional<ImageConversion> existing = imageConversionRepository.findByOriginalUrl(normalizedUrl);
|
||||||
if (existing.isPresent()) {
|
if (existing.isPresent()) {
|
||||||
ImageConversion conversion = existing.get();
|
ImageConversion conversion = existing.get();
|
||||||
log.debug("使用缓存的转换结果: {} -> {}", originalUrl, conversion.getConvertedUrl());
|
log.debug("使用缓存的转换结果: {} -> {}", normalizedUrl, conversion.getConvertedUrl());
|
||||||
return conversion.getConvertedUrl();
|
return conversion.getConvertedUrl();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 执行转换
|
// 执行转换(使用规范化URL)
|
||||||
String convertedUrl = performConversion(originalUrl);
|
log.info("开始转换webp图片: {}", normalizedUrl);
|
||||||
log.info("图片转换成功: {} -> {}", originalUrl, convertedUrl);
|
String convertedUrl = performConversion(normalizedUrl);
|
||||||
|
log.info("图片转换成功: {} -> {}", normalizedUrl, convertedUrl);
|
||||||
return convertedUrl;
|
return convertedUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 规范化URL:处理协议相对URL等特殊情况
|
||||||
|
*
|
||||||
|
* @param url 原始URL
|
||||||
|
* @return 规范化后的URL
|
||||||
|
*/
|
||||||
|
private String normalizeUrl(String url) {
|
||||||
|
if (StrUtil.isBlank(url)) {
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 清理特殊字符(如零宽字符)
|
||||||
|
String cleanUrl = url.trim().replaceAll("[\\u200B-\\u200D\\uFEFF]", "");
|
||||||
|
|
||||||
|
// 处理协议相对URL(//开头)
|
||||||
|
if (cleanUrl.startsWith("//")) {
|
||||||
|
cleanUrl = "https:" + cleanUrl;
|
||||||
|
log.debug("转换协议相对URL: {} -> {}", url, cleanUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
return cleanUrl;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 检查URL是否为webp格式
|
* 检查URL是否为webp格式
|
||||||
*
|
*
|
||||||
@@ -164,13 +204,22 @@ public class ImageConvertService {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查URL中是否包含.webp
|
// 清理URL中的特殊字符(如零宽字符)
|
||||||
String lowerUrl = url.toLowerCase();
|
String cleanUrl = url.trim().replaceAll("[\\u200B-\\u200D\\uFEFF]", "");
|
||||||
|
|
||||||
|
// 检查URL中是否包含.webp扩展名(不区分大小写)
|
||||||
|
String lowerUrl = cleanUrl.toLowerCase();
|
||||||
// 检查URL参数或路径中是否包含webp
|
// 检查URL参数或路径中是否包含webp
|
||||||
return lowerUrl.contains(".webp") ||
|
boolean isWebp = lowerUrl.contains(".webp") ||
|
||||||
lowerUrl.contains("format=webp") ||
|
lowerUrl.contains("format=webp") ||
|
||||||
lowerUrl.contains("?webp") ||
|
lowerUrl.contains("?webp") ||
|
||||||
lowerUrl.contains("&webp");
|
lowerUrl.contains("&webp");
|
||||||
|
|
||||||
|
if (isWebp) {
|
||||||
|
log.debug("检测到webp格式图片: {}", cleanUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
return isWebp;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user