This commit is contained in:
2025-11-03 15:46:21 +08:00
parent 4af64b58d6
commit efdb727e48

View File

@@ -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;
} }
/** /**