dede 缩略图 图片地址

99ANYc3cd6
预计阅读时长 25 分钟
位置: 首页 DEDE建站 正文

DedeCMS 如何存储图片?

在 DedeCMS 中,文章的缩略图信息主要存储在数据库的 dede_archives 表(文章主表)中,有两个关键的字段:

  1. litpic:这是专门用来存储缩略图地址的字段,当你上传或选择缩略图时,图片的路径就会被保存在这里,如果文章没有设置缩略图,这个字段通常是空字符串 。
  2. body:这是文章内容字段,类型为 TEXTMEDIUMTEXT,它存储的是通过编辑器(如 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}

上面的 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)'/}

DedeCMS 提供了一个非常方便的函数 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 是最稳定和通用的方法。

使用自定义函数(更灵活、更推荐)

虽然内置函数很方便,但为了更好的控制和兼容性,强烈建议你创建一个自定义函数。

步骤 1:创建自定义函数文件

/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 '';
}

步骤 2:在模板中调用

现在你可以在任何模板中调用这个新函数了。

{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. 相对路径)

DedeCMS 的 litpic 字段存储的路径格式,取决于你在后台的设置。

后台设置路径: 登录 DedeCMS 后台 -> 系统 -> 系统基本参数 -> 核心设置 找到 “附件目录” 和 “(可选)多站点附件目录设置”。 更关键的是,确保你的图片上传路径是正确的,并且网站能够正常访问到这个路径。

如何确保图片显示正常?

  1. 使用绝对路径:这是最稳妥的方法,可以避免因页面位置不同导致路径错误的问题。 你可以在调用图片时,手动加上你的域名。

    示例:

    <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/]" />

    这段代码比较复杂,但能很好地处理路径问题,更简单的方法是在上传图片时就确保生成的是绝对路径。

  2. 检查后台设置:在 “核心设置” 中,找到 “附件路径”,可以设置为 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 中提取,并始终对结果进行判断,以提供最健壮和用户体验最好的前端显示。

-- 展开阅读全文 --
头像
dede会员手机验证码开发如何实现?
« 上一篇 02-07
织梦cms怎么上传文件
下一篇 » 02-07
取消
微信二维码
支付宝二维码