织梦cms栏目远程图片

远程图片处理概述

在织梦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]
最佳实践:建议始终保持"远程图片本地化"功能开启,并在发布文章时等待远程图片下载完成后再确认发布。对于采集量大或远程图片较多的场景,可编写定时脚本批量处理,避免单次处理超时。