DedeCMS 如何存储图片?
在 DedeCMS 中,文章的缩略图信息主要存储在数据库的 dede_archives 表(文章主表)中,有两个关键的字段:
litpic:这是专门用来存储缩略图地址的字段,当你上传或选择缩略图时,图片的路径就会被保存在这里,如果文章没有设置缩略图,这个字段通常是空字符串 。body:这是文章内容字段,类型为TEXT或MEDIUMTEXT,它存储的是通过编辑器(如 Dede 默认编辑器或 KindEditor)生成的 HTML 代码,你上传的中的图片,其<img>标签就包含在这个body字段里。
获取缩略图地址 (litpic)
这是最直接、最推荐的方式,专门用于获取文章的封面缩略图。
在模板中调用
在文章列表页、文章内容页等模板文件中,使用 DedeCMS 的内置标签 {dede:field} 来调用。
语法:
{dede:field name='litpic'/}
使用示例 (在列表页 list_article.htm 中):
{dede:arclist titlelen='42' row='10'}
<li>
<!-- 调用缩略图 -->
<a href="[field:arcurl/]">
<img src="[field:litpic/]" alt="[field:title/]" />
</a>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
注意事项:
- 判断缩略图是否存在:很多情况下,并非所有文章都有缩略图,直接调用
[field:litpic/]如果没有图片,可能会显示一个破损的图标,最好加上判断。
推荐写法 (带判断):
使用 if 标签进行判断。
{dede:arclist titlelen='42' row='10'}
<li>
<!-- 如果缩略图存在,则显示缩略图,否则不显示或显示默认图 -->
[field:litpic runphp='yes']
if(@me != '') {
@me = '<a href="'.@me.'"><img src="'.@me.'" alt="'.@me.'" /></a>';
} else {
@me = ''; // 或者显示一个默认图片:<img src="/images/default.jpg" alt="暂无图片" />
}
[/field:litpic]
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
上面的 如果你需要从文章内容里提取第一张图片作为缩略图(这是一种常见的做法,可以节省手动设置缩略图的工作量),你需要使用自定义函数。 DedeCMS 提供了一个非常方便的函数 语法: 使用示例: 这个函数通常和 注意: 虽然内置函数很方便,但为了更好的控制和兼容性,强烈建议你创建一个自定义函数。 步骤 1:创建自定义函数文件 在 步骤 2:在模板中调用 现在你可以在任何模板中调用这个新函数了。 更完整的写法(带判断和默认图): DedeCMS 的 后台设置路径:
登录 DedeCMS 后台 -> 系统 -> 系统基本参数 -> 核心设置
找到 “附件目录” 和 “(可选)多站点附件目录设置”。
更关键的是,确保你的图片上传路径是正确的,并且网站能够正常访问到这个路径。 如何确保图片显示正常? 使用绝对路径:这是最稳妥的方法,可以避免因页面位置不同导致路径错误的问题。
你可以在调用图片时,手动加上你的域名。 示例: 如果你的网站可能部署在子目录,可以使用 推荐写法: 这段代码比较复杂,但能很好地处理路径问题,更简单的方法是在上传图片时就确保生成的是绝对路径。 检查后台设置:在 “核心设置” 中,找到 “附件路径”,可以设置为 最佳实践是:优先使用 runphp='yes' 语法比较复杂,更现代和简洁的方式是使用 if
{dede:arclist titlelen='42' row='10'}
<li>
{dede:if field='litpic' != ''}
<a href="[field:arcurl/]">
<img src="[field:litpic/]" alt="[field:title/]" />
</a>
{/dede:if}
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
获取文章内容中的图片 (
body)使用 DedeCMS 内置函数
{dede:field.body function='GetFirstImg(@me)'/}GetFirstImg,专门用于从文章内容中提取第一张图片的地址。{dede:field.body function='GetFirstImg(@me)'/}
if 标签结合使用,以避免在没有图片时出错。{dede:arclist titlelen='42' row='10'}
<li>
{dede:if field='litpic' != ''}
<!-- 优先使用手动设置的缩略图 -->
<img src="[field:litpic/]" alt="[field:title/]" />
{else}
<!-- 如果没有手动设置,则尝试从内容中提取第一张图 -->
[field:body function='(preg_match("/<img([^>]*)src=['\"']([^'\"]+)['\"'][^>]*>/i", @me, $matches) ? $matches[2] : "")'/]
{/dede:if}
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
{dede:field.body function='GetFirstImg(@me)'/} 这种写法在某些新版本或特定配置下可能不生效,直接使用正则表达式 preg_match 是最稳定和通用的方法。使用自定义函数(更灵活、更推荐)
/include/extend.func.php 文件中添加以下 PHP 函数,如果这个文件不存在,你可以创建一个。/**
* 获取文章body中的第一张图片路径
* @param string $body 文章内容
* @return string 图片路径,如果没有则返回空字符串
*/
function GetFirstImgs($body)
{
$preg = "/<img.*?src=[\'|\"](.*?)[\'|\"].*?[\/]?>/i";
preg_match_all($preg, $body, $match);
if (!empty($match[1])) {
// 返回第一张图片的地址
return $match[1][0];
}
// 如果没有图片,可以返回一个默认图片地址
// return '/images/default.jpg';
return '';
}
{dede:arclist titlelen='42' row='10'}
<li>
<!-- 调用我们自定义的函数 -->
{dede:field name='body' function='GetFirstImgs(@me)'/}
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
{dede:arclist titlelen='42' row='10'}
<li>
<a href="[field:arcurl/]">
<!-- 优先使用手动设置的缩略图 -->
{dede:if field='litpic' != ''}
<img src="[field:litpic/]" alt="[field:title/]" />
{else}
<!-- 否则,调用自定义函数获取内容第一张图 -->
[field:body function='GetFirstImgs(@me)'/]
{dede:if field='body' function='GetFirstImgs(@me)'}
<img src="[field:body function='GetFirstImgs(@me)'/]" alt="[field:title/]" />
{else}
<!-- 如果内容里也没有图,则显示默认图 -->
<img src="/images/no_pic.jpg" alt="[field:title/]" />
{/dede:if}
{/dede:if}
</a>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
图片路径问题(绝对路径 vs. 相对路径)
litpic 字段存储的路径格式,取决于你在后台的设置。
<img src="http://www.yourdomain.com/[field:litpic/]" alt="[field:title/]" />
{dede:global.cfg_basehost/} 来获取网站根目录域名。<img src="[field:litpic function='str_replace("..", "", "@me");' runphp='yes']if(@me != '') {@me = str_replace("./", "", @me); @me = str_replace("../", "", @me); @me = str_replace("//", "/", "{@GLOBALS['cfg_basehost']}/".trim(@me, './'));}else{@me = '';}[/field:litpic]" alt="[field:title/]" />
http://www.yourdomain.com/uploads/ 这样的绝对路径,这样,litpic 字段里存储的就是完整的 URL 了。
需求
推荐方法
代码示例
适用场景
获取手动设置的缩略图
使用
{dede:field.litpic/}[field:litpic/]获取文章封面图,最常用。
获取文章内容第一张图
使用自定义函数
GetFirstImgs[field:body function='GetFirstImgs(@me)'/]中提取封面图。
判断图片是否存在
使用 {dede:if}
{dede:if field='litpic' != ''}...{/dede:if}避免显示破损图片,优化用户体验。
确保图片路径正确
使用绝对路径或域名拼接
src="http://www.yourdomain.com/[field:litpic/]"解决图片不显示的问题。
litpic,如果没有,再从 body 中提取,并始终对结果进行判断,以提供最健壮和用户体验最好的前端显示。
