织梦 DedeCMS 在发布文章时,缩略图(litpic)有时不会自动生成,列表页缩略图位置空白或显示默认占位图。这个问题涉及上传、GD 处理、字段绑定、模板调用多个环节,下面按常见原因逐项排查。
一、缩略图生成机制
织梦缩略图有三种来源:
1. 手动上传
文章编辑页"缩略图"框点击上传,文件存到 /uploads/litimg/。
2. 自动提取正文第一张图
发布时勾选"提取第一个为缩略图",系统从 body 中抓取第一张图,调用 ImageResize 生成小图存到 /uploads/allimg/YYMMDD/。
3. 远程图片本地化
勾选"下载远程图片",下载后生成缩略图。
缩略图处理统一由 /include/image.func.php 中的 ImageResize、ImageResizeNew 完成,依赖 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]。
织梦缩略图不生成,本质是"GD 扩展 + 目录权限 + 内存/水印 + 模型字段"四要素里某一环掉链子。建议部署完站点立即用一张标准 JPG 跑通完整上传流程,把缩略图生成能力纳入上线 checklist。日常运维中遇到缩略图失效,第一时间看 PHP 错误日志而非凭经验猜,能最快定位到具体函数级别的问题。把"无缩略图"列表页加上默认占位图,是用户体验层面最简单的兜底方案。