织梦如何远程下载图片与资源?

99ANYc3cd6
预计阅读时长 12 分钟
位置: 首页 织梦建站 正文

核心原理

织梦的远程资源本地化功能,其工作流程如下:

织梦下载远程图片和资源
(图片来源网络,侵删)
  1. 内容解析:当你在后台发布文章、产品或其他内容时,织梦会解析内容中的 HTML 代码。
  2. URL 捕获:系统会扫描内容中的 <img><link><script><iframe><video><audio> 等标签,提取出 srchref 属性指向的远程文件 URL。
  3. 文件下载:织梦会使用 PHP 的 cURLfile_get_contents 函数,向这些远程 URL 发起请求,将文件内容下载到服务器上。
  4. 本地存储:下载的文件会被保存到你指定的本地目录(通常是 /uploads/ 下的某个子文件夹)。
  5. URL 替换:织梦会用刚刚生成的本地文件 URL,替换掉内容中原来的远程 URL。

这样一来,文章里的所有外部资源就都变成了你服务器上的内部资源,既加快了网站访问速度,也避免了因源站失效或跨域问题导致的图片/资源无法显示。


后台全局设置(最常用、最推荐)

这是最简单、最常规的方法,适用于所有常规的内容发布。

开启自动下载开关

这是功能总开关,必须确保开启。

  • 路径:登录织梦后台 -> 系统 -> 系统基本参数 -> 核心设置
  • 找到选项是否采集远程图片
  • 设置:将其值修改为 “是”
  • 点击:页面底部的“保存更改”按钮。

设置本地保存目录

你需要指定一个文件夹来存放这些下载下来的资源。

织梦下载远程图片和资源
(图片来源网络,侵删)
  • 路径:登录织梦后台 -> 系统 -> 系统基本参数 -> 附件设置
  • 找到选项远程站点附件保存目录
  • 设置:这里默认是 uploads/allimg/,你可以保持默认,也可以自定义,uploads/remote/
    • 注意:这个目录必须是相对于网站根目录的,并且确保该目录存在且具有可写权限(755777,视服务器安全策略而定)。
  • 点击:页面底部的“保存更改”按钮。

发布/编辑文章时自动生效

完成以上两步设置后,当你通过织梦后台的 功能发布文章时,系统会自动扫描文章内容中的远程图片。

  • 在编辑器中,你可以直接粘贴包含远程图片的网页内容。
  • 点击“保存”或“发布”按钮后,织梦会自动执行下载和替换操作。
  • 你可以在文章的“详细内容”编辑框下方的“远程图片”区域看到下载日志和结果。

手动触发下载(适用于已发布的内容)

如果你之前发布的文章里有很多远程图片,或者通过其他方式(如数据库直接导入)添加了远程图片,你可以使用织梦的“一键更新”功能来批量处理。

  • 路径:登录织梦后台 -> 系统 -> 一键更新网站 ->
  • 操作步骤
    1. 在“选择内容”页面,你可以选择要处理的栏目(全站”)。
    2. 勾选 “选择远程图片” 这个选项。
    3. 点击“开始执行”。
  • 工作原理:系统会遍历你选择的所有文章,对每一篇文章的内容执行“捕获远程URL -> 下载 -> 替换”的流程。

修改代码实现更强大的功能(高级用户)

默认的远程图片下载功能有时会显得“笨拙”,比如无法处理特定域名的图片、无法识别特定格式的资源等,如果你有开发能力,可以通过修改代码来增强功能。

场景示例:让织梦忽略某个特定域名

假设你不想让织梦下载 example.com 域名下的图片。

织梦下载远程图片和资源
(图片来源网络,侵删)
  1. 找到核心文件: 这个功能的核心逻辑在 /include/helpers/assist.helper.php 文件中的 GetRemoteImage() 函数。

  2. 修改代码: 打开 assist.helper.php 文件,找到 GetRemoteImage 函数,在函数内部,通常在下载逻辑之前,会有一个 $mm 变量来判断是否允许下载。

    你可以添加一个 if 条件来判断 URL,如果域名是你想忽略的,就直接返回原 URL,不进行下载。

    代码示例

    // 在 GetRemoteImage 函数中,找到类似下面这行代码的位置
    if($m == 1)
    {
        // 在这里添加你的判断逻辑
        if (strpos($remoteUrl, 'example.com') !== false) {
            // 如果是 example.com 的图片,则不做处理,直接返回原URL
            return $remoteUrl;
        }
        // ... 原有的下载代码 ...
        $fileurl = $cfg_uploaddir.'/'.MyDate($cfg_addondate, $t).'/'.$filename;
        // ... 后续代码 ...
    }

    注意:直接修改核心文件在织梦升级后可能会被覆盖,请做好备份或使用代码版本控制。


常见问题与解决方案

Q: 远程图片下载失败,提示“无法获取远程图片内容”或“allow_url_fopen is off”?

  • 原因:这通常是因为 PHP 的 allow_url_fopen 功能被禁用了,织梦默认使用这个函数来获取远程内容。
  • 解决方案
    1. 首选方案:联系你的服务器空间商,开启 allow_url_fopen
    2. 备选方案:如果空间商无法开启,可以修改织梦,让它使用 cURL 来代替,打开 /include/helpers/extend.helper.php 文件,找到 ddGetHttpContent 函数,确保 if (function_exists('curl_init')) 这个分支的代码是有效的,并且织梦的其他相关函数(如 GetHttpContent)会优先调用它。

Q: 下载的图片路径不正确,或者图片打不开?

  • 原因
    • 附件保存目录的路径设置错误。
    • 保存目录没有写入权限。
    • 服务器开启了安全模式,或者目录权限设置过于严格(如 644)。
  • 解决方案
    1. 检查 系统基本参数 -> 附件设置 中的 远程站点附件保存目录 是否正确。
    2. 使用 FTP 或文件管理器登录服务器,检查该目录是否存在,并尝试将权限修改为 755
    3. 检查 uploads 目录及其子目录的权限。

Q: 为什么有些图片(如 base64 编码的)没有被下载?

  • 原因:织梦的默认规则是解析 <img src="http://..."> 这种标准 URL,对于 src="data:image/png;base64,..." 这种内联的 base64 图片,默认规则不会处理。
  • 解决方案:这需要通过 方法三(修改代码) 来实现,你需要修改 GetRemoteImage 函数,增加对 data:image 格式的识别和下载逻辑,这涉及到更复杂的字符串处理和文件保存操作。
方法 适用场景 优点 缺点
后台设置 发布新文章、编辑已有文章 简单、方便、无需代码 功能固定,无法自定义规则
一键更新 批量处理已发布的旧文章 高效、批量 可能会对服务器造成较大压力
修改代码 需要自定义下载规则(如忽略特定域名、处理base64) 功能强大、灵活 需要开发能力,升级后可能失效

对于绝大多数用户来说,方法一 已经足够满足日常需求,遇到问题时,首先检查后台设置和服务器权限,这能解决 90% 的问题,如果需要更复杂的功能,再考虑 方法三

-- 展开阅读全文 --
头像
C语言中如何定义3.1415926为常量?
« 上一篇 今天
织梦文章浏览次数如何正确调用?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]