修复 MarkdownImageLocalizer 插件图片重复下载问题

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. 测试建议

  1. 发布测试文章:创建一篇包含远程图片的文章并发布
  2. 检查图片URL:查看文章页面,确认封面图片和内容中的第一张图片URL是否相同
  3. 验证文件唯一性:检查服务器 /usr/uploads/YYYY/MM/ 目录,确认同一张图片只存在一个文件
  4. 查看调试日志:检查 debug.log 文件,确认出现 "File already exists" 日志(表示重复检测生效)

标签: none

暂无评论