1. 基本信息
| 信息项 | 详情 |
|---|---|
| 文件名称 | ImageProcessor.php |
| 文件路径 | /usr/plugins/MarkdownImageLocalizer/ImageProcessor.php |
| 修改描述 | 修复BUG |
| 最后更新 | 2026-05-03 |
2. 修改说明(简述)
本次修改修复了 MarkdownImageLocalizer 插件中远程图片重复下载的问题。当文章内容中的第一张图片被提取为封面时,由于文件名生成逻辑使用随机ID,导致同一张图片被下载两次,造成服务器存储空间浪费。
3. 修改详情
修改点 1:第 166-168 行,文件名生成逻辑
修改前代码:
// 生成文件名
$fileName = sprintf('%u', crc32(uniqid())) . '.' . $ext;修改后代码:
// 生成基于内容哈希的文件名,防止重复下载相同图片
$hash = md5($imageData);
$fileName = $hash . '.' . $ext;修改作用: 将文件名从基于随机ID改为基于图片内容的MD5哈希值,确保相同内容的图片生成相同的文件名,从根本上避免重复下载。
修改点 2:第 182-195 行,文件保存逻辑
修改前代码:
// 保存文件
$uploadPath = $uploadDir . '/' . $fileName;
if (!file_put_contents($uploadPath, $imageData)) {
throw new \Exception('Cannot save file');
}
// 压缩图片
if ($compressQuality > 0 && $compressQuality <= 100) {
$this->compressImage($uploadPath, $compressQuality);
}修改后代码:
// 保存文件
$uploadPath = $uploadDir . '/' . $fileName;
// 检查文件是否已存在,避免重复保存
if (!file_exists($uploadPath)) {
if (!file_put_contents($uploadPath, $imageData)) {
throw new \Exception('Cannot save file');
}
// 压缩图片
if ($compressQuality > 0 && $compressQuality <= 100) {
$this->compressImage($uploadPath, $compressQuality);
}
} else {
$log = "[" . date('Y-m-d H:i:s') . "] File already exists: {$uploadPath}\n";
@file_put_contents($debugFile, $log, FILE_APPEND);
}修改作用: 添加文件存在检查逻辑,当图片文件已存在时跳过保存操作,避免重复写入相同内容,并记录调试日志。
4. 影响范围
- 影响模块:仅影响
ImageProcessor图片处理类 - 配置变更:无需更新配置
- 数据库:不涉及数据库变更
- 兼容性:完全向后兼容,不影响现有功能
5. 测试建议
- 发布测试文章:创建一篇包含远程图片的文章并发布
- 检查图片URL:查看文章页面,确认封面图片和内容中的第一张图片URL是否相同
- 验证文件唯一性:检查服务器
/usr/uploads/YYYY/MM/目录,确认同一张图片只存在一个文件 - 查看调试日志:检查
debug.log文件,确认出现 "File already exists" 日志(表示重复检测生效)
暂无评论