织梦远程附件图片本地化失效

采集图片本地化不生效的多种原因与逐项排查

本地化失效的现象

织梦采集规则中“是否下载图片到本地”开启后,正常情况下采集的文章外链图片会被下载到 uploads/allimg/ 并替换为本地 URL。失效时表现为:文章发布成功但图片仍是外链、图片显示为破损图标、采集日志报下载失败、本地目录没有新增文件。外链图片长期依赖第三方服务器,一旦对方删除或防盗链,文章图片即丢失,必须尽快修复本地化。

失效原因分类

分类典型原因
网络层服务器出口被墙、DNS 解析失败、超时
权限层uploads 目录无写权限
配置层采集规则未勾选下载图片
防盗链目标站 Referer 校验,返回 403
SSL层cURL 证书校验失败
程序层PHP 扩展缺失、allow_url_fopen 关闭

逐项排查步骤

1. 确认采集规则配置

后台 采集 → 采集节点管理 → 编辑节点,确认“图片是否下载到本地”勾选为“是”,并填写正确的保存目录。

2. 检查目录权限

ls -ld /www/wwwroot/dedecms/uploads/allimg
# 期望属主为 Web 用户,权限 755
chown -R www:www /www/wwwroot/dedecms/uploads/allimg
chmod -R 755 /www/wwwroot/dedecms/uploads/allimg

3. 检查 PHP 配置

# php.ini 确认
allow_url_fopen=On
; cURL 扩展必须启用
extension=curl
extension=openssl
; 超时建议放大
max_execution_time=120
default_socket_timeout=60

4. 手动测试下载

在服务器上 curl 测试目标图片,验证网络与防盗链:

curl -I -A "Mozilla/5.0" -e "https://target.com/" \
  https://target.com/image.jpg
# 期望 200,若 403 多为防盗链
# 若超时检查 DNS 与出口

常见故障与修复

故障一:防盗链 403

目标站校验 Referer,需在采集下载时伪造 Referer。修改 include/dedecollection.class.php 的 cURL 请求:

curl_setopt($ch, CURLOPT_REFERER, $sourceUrl);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 ...');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Accept: image/webp,*/*',
    'Accept-Language: zh-CN,zh;q=0.9',
]);

故障二:SSL 证书校验失败

// 开发环境可临时关闭校验,生产建议更新 CA 证书
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// 正规做法:更新 ca-bundle
yum update ca-certificates

故障三:超时下载大图失败

curl_setopt($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
// 大于 5MB 的图先存临时文件再 move
$tmpFile=tempnam('/tmp', 'img');
curl_setopt($ch, CURLOPT_FILE, fopen($tmpFile, 'w'));

故障四:本地化开关未生效

部分老版本采集类存在 bug,即使勾选也不下载。需打补丁,在 collection.inc.phpDownImage 方法加入:

if ($this->notdownpic=='N') {
    $this->DownImage($picurl);
}

验证本地化生效

  • 采集一篇文章后查看源码,<img src> 是否为本站 URL。
  • 检查 uploads/allimg 当天目录是否有新文件。
  • 数据库 body 字段 grep 外链域名,应为 0。
  • 统计 7 天内外链图片占比,应趋近 0。
建议在采集完成后跑一个脚本,扫描所有文章 body,把仍存在外链图片的文章列出待处理,避免长期累积。

注意事项

  • 下载他人图片注意版权,建议加水印并标注来源。
  • 大图下载会拖慢采集,建议限制单图 ≤ 5MB。
  • 下载失败时保留外链,避免文章无图。
  • 批量本地化历史文章时控制并发,避免被目标站封 IP。
  • 定期清理被本地化但实际未引用的孤儿图片。

建议与后续

把图片本地化做成采集后的独立校验任务:采集完成 → 扫描外链 → 自动补下载 → 生成报告。把成功率、平均耗时、失败图片列表纳入采集看板,失败立即处理。同时考虑接入 OCR 与 AI 自动配图,对外链失效的图片做内容兜底,让织梦采集内容在版权与稳定性之间取得平衡,长期保持文章质量。