织梦缩略图不生成怎么处理

织梦 DedeCMS 在发布文章时,缩略图(litpic)有时不会自动生成,列表页缩略图位置空白或显示默认占位图。这个问题涉及上传、GD 处理、字段绑定、模板调用多个环节,下面按常见原因逐项排查。

一、缩略图生成机制

织梦缩略图有三种来源:

1. 手动上传

文章编辑页"缩略图"框点击上传,文件存到 /uploads/litimg/

2. 自动提取正文第一张图

发布时勾选"提取第一个为缩略图",系统从 body 中抓取第一张图,调用 ImageResize 生成小图存到 /uploads/allimg/YYMMDD/

3. 远程图片本地化

勾选"下载远程图片",下载后生成缩略图。

缩略图处理统一由 /include/image.func.php 中的 ImageResizeImageResizeNew 完成,依赖 PHP GD 扩展。

二、常见根因

1. PHP 没装 GD 扩展

最常见原因。ImageResize 函数调用 imagecreatefromjpeg 等函数,没有 GD 就直接返回 false。

2. uploads/litimg 或 allimg 目录不可写

GD 处理完缩略图后写文件失败,但织梦不报错,前端拿到的就是空 litpic。

3. 水印图片缺失

开启了水印但 /data/mark/mark.png 不存在,waterimg 报错导致缩略图生成中断。

4. 内存不足

处理大图(>5MB)时 imagecreatefromjpeg 占用内存翻倍,PHP 内存不够直接退出。

5. 源图格式不被支持

BMP、WebP、PSD 等格式 GD 无法直接处理,需要先转 JPG/PNG。

6. 文章模型没绑定 litpic 字段

自定义内容模型如果没添加 litpic 字段,发布时根本没保存缩略图。

三、排查步骤

1. 在根目录新建 phpinfo.php,访问后搜索 "gd",确认是否启用。

2. 上传一张普通 jpg 看是否生成缩略图,能生成则排除 GD 问题。

3. 检查 /uploads/litimg//uploads/allimg/今日日期/ 权限:

ls -ld /www/wwwroot/域名/uploads/litimg
# 应显示 www:www 755

4. 查看 PHP 错误日志,搜索 "imagecreatefrom"、"memory"。p>

5. 后台 → 系统 → 图片水印设置,临时关闭水印看是否能生成。

四、修复方案

1. 安装 GD 扩展

yum install php-gd
systemctl restart php-fpm

宝塔:软件商店 → PHP 版本 → 设置 → 安装扩展 → 开启 GD 库。

2. 修复目录权限

chmod -R 755 /www/wwwroot/域名/uploads
chown -R www:www /www/wwwroot/域名/uploads
mkdir -p /www/wwwroot/域名/uploads/litimg
chmod 755 /www/wwwroot/域名/uploads/litimg

3. 修复水印图片

把原版织梦包里的 /data/mark/mark.png/data/mark/simhei.ttf 上传覆盖。或后台关闭水印功能。

4. 调大 PHP 内存

memory_limit=256M

5. 给自定义模型加 litpic 字段

后台 → 核心 → 内容模型管理 → 编辑模型 → 字段管理 → 添加新字段:字段名 litpic,前端表单类型"图片"。

调试技巧:打开 /include/image.func.php,在 ImageResize 函数入口加 file_put_contents('/tmp/img.log', $src.'|'.$to.'|'.(int)function_exists('imagecreatefromjpeg')."\n",FILE_APPEND);,能看到调用链。

五、批量补生成历史缩略图

对于已发布但没缩略图的文章,可以写脚本批量从正文提取第一张图:

<?php
require 'include/common.inc.php';
$dsql->SetQuery("SELECT id,body FROM dede_addonarticle WHERE aid IN (
    SELECT id FROM dede_archives WHERE litpic=''
)");
$dsql->Execute();
while($row=$dsql->GetArray()){
    if(preg_match('/<img.*?src=["\']([^"\']+)["\']/i',$row['body'],$m)){
        $litpic=$m[1];
        $dsql->ExecuteNoneQuery("UPDATE dede_archives SET litpic='$litpic' WHERE id={$row['id']}");
    }
}
echo 'done';

执行后到后台重新生成列表页即可。

六、注意事项

1. 缩略图尺寸在 后台 → 系统 → 附件设置 里调整,默认 240×180。

2. 启用 GD 后记得 php.ini 开启 gd.jpeg_ignore_warning=On,避免部分损坏图导致 GD 报错。

3. 远程图片本地化需要服务器开启 allow_url_fopen 或安装 cURL。

4. 列表页模板用 [field:litpic/] 输出,没有缩略图时为空,建议加判断 [field:litpic runphp=yes]if(@me=='')@me='/images/nopic.jpg';[/field:litpic]

风险提醒:批量更新 litpic 前一定要备份 dede_archives 表,避免正则匹配出错把 litpic 写成乱码。

织梦缩略图不生成,本质是"GD 扩展 + 目录权限 + 内存/水印 + 模型字段"四要素里某一环掉链子。建议部署完站点立即用一张标准 JPG 跑通完整上传流程,把缩略图生成能力纳入上线 checklist。日常运维中遇到缩略图失效,第一时间看 PHP 错误日志而非凭经验猜,能最快定位到具体函数级别的问题。把"无缩略图"列表页加上默认占位图,是用户体验层面最简单的兜底方案。