远程图片处理概述
在织梦CMS中发布文章时,经常会用到远程图片(引用其他网站的图片URL)。织梦CMS提供了远程图片本地化功能,可以将远程图片自动下载到服务器本地,避免图片失效导致页面显示异常。
一、开启远程图片本地化
在系统参数中配置:
<!-- 系统 > 系统基本参数 > 附件设置 --> 远程图片本地化: 开启 远程图片保存目录: /uploads/allimg/ 图片允许的文件类型: jpg,gif,png,bmp,jpeg 图片最大尺寸限制: 2048KB 自动下载远程图片: 是
二、发布文章时自动下载远程图片
织梦CMS在发布文章时会检测内容中的远程图片URL:
<!-- 远程图片自动替换流程 --> 1. 检测正文中的标签 2. 判断src的域名是否为本地 3. 非本地域名的图片 → 下载到服务器 4. 替换为本地URL 5. 生成本地缩略图(可选) 示例: 原文:<img src="https://example.com/pic.jpg"> 处理后:<img src="/uploads/allimg/240801/1-240801123456.jpg">
三、手动批量本地化远程图片
对已发布的文章批处理远程图片:
<?php
// 批量处理栏目中文章的远程图片
require_once(dirname(__FILE__)."/include/common.inc.php");
$typeid=3; // 目标栏目ID
$sql="SELECT a.id, ad.body FROM dede_archives a
LEFT JOIN dede_addonarticle ad ON a.id=ad.aid
WHERE a.typeid={$typeid}";
$dsql->SetQuery($sql);
$dsql->Execute();
while($row=$dsql->GetArray()){
$body=$row['body'];
if(empty($body)) continue;
// 匹配所有图片标签
preg_match_all('/
]+src="([^"]+)"[^>]*>/i', $body, $matches);
if(!empty($matches[1])){
$updated=false;
foreach($matches[1] as $key=> $imgUrl){
// 检查是否为远程图片
$host=parse_url($imgUrl, PHP_URL_HOST);
$localHost=$_SERVER['HTTP_HOST'];
if($host && $host !=$localHost){
// 下载远程图片
$localPath=downloadRemoteImage($imgUrl);
if($localPath){
$body=str_replace($matches[0][$key],
str_replace($imgUrl, $localPath, $matches[0][$key]),
$body);
$updated=true;
}
}
}
if($updated){
$body=addslashes($body);
$dsql->ExecuteNoneQuery(
"UPDATE dede_addonarticle SET body='{$body}'
WHERE aid={$row['id']}"
);
echo "文章ID {$row['id']} 图片已本地化\n";
}
}
}
?>
四、下载远程图片的函数实现
<?php
function downloadRemoteImage($url){
$saveDir='/uploads/allimg/'.date('ymd').'/';
$fullDir=dirname(__FILE__).$saveDir;
// 创建保存目录
if(!is_dir($fullDir)){
mkdir($fullDir, 0777, true);
}
// 生成文件名
$ext=pathinfo(parse_url($url, PHP_URL_PATH), PATHINFO_EXTENSION);
if(!in_array(strtolower($ext), ['jpg','jpeg','png','gif','bmp'])){
$ext='jpg';
}
$filename=date('His').'_'.mt_rand(1000,9999).'.'.$ext;
// 下载图片
$imageData=file_get_contents($url, false, stream_context_create([
'http'=> ['timeout'=> 10]
]));
if($imageData){
file_put_contents($fullDir.$filename, $imageData);
return $saveDir.$filename;
}
return false;
}
?>
五、防止远程图片盗链
<!-- .htaccess防盗链设置 -->
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain\.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?google\.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?baidu\.com [NC]
RewriteRule \.(jpg|jpeg|png|gif|bmp)$ /images/no-hotlink.jpg [NC,R,L]
最佳实践:建议始终保持"远程图片本地化"功能开启,并在发布文章时等待远程图片下载完成后再确认发布。对于采集量大或远程图片较多的场景,可编写定时脚本批量处理,避免单次处理超时。