DedeCMS处理图片上传主要有两种方式:
- 推荐方式:上传到服务器,路径存入数据库 (最常用、最标准)
- 特定方式:直接上传到数据库字段 (不常用,有特定限制)
下面我们分别详细说明这两种方法。
上传到服务器,路径存入数据库 (99%的情况使用这是)
这是最主流、最安全、最高效的方式,数据库中只存储图片的路径信息(/uploads/images/2025/10/abc.jpg),而图片文件本身则存放在你网站的 uploads 文件夹中。
准备工作(确保上传功能正常)
在开始上传前,请确保你的DedeCMS环境配置正确。
-
文件权限:
- 确保网站根目录下的
uploads文件夹及其子文件夹(如images,img,allimg等)有写入权限(通常是755或775,具体取决于你的服务器环境)。 - 如果使用FTP工具,右键点击文件夹 -> 权限,勾选“写入”或“执行”。
- 确保网站根目录下的
-
PHP配置:
- 登录你的网站服务器后台(如cPanel、宝塔面板等),找到
php.ini配置文件。 - 检查并修改以下几个关键参数,确保它们足够大:
upload_max_filesize: 允许上传的单个文件大小,建议设置为32M或更大。post_max_size: POST请求的最大大小,这个值必须大于或等于upload_max_filesize,建议也设置为32M或更大。memory_limit: PHP脚本最大内存占用,建议设置为128M或更大。max_execution_time: PHP脚本最大执行时间,上传大文件时可能需要延长,建议设置为300(秒)。
- 登录你的网站服务器后台(如cPanel、宝塔面板等),找到
-
DedeCMS后台设置:
- 登录DedeCMS后台。
- 进入 “系统” -> “系统基本参数” -> “核心设置”。
- 找到 “附件上传路径” 和 “图片上传路径”,确保它们指向了正确的文件夹,
uploads/allimg和uploads/images,你还可以根据需要设置是否按日期生成子目录。 - 保存设置。
在前台或后台上传图片
根据你的需求,可以在不同地方上传图片。
A. 在文章/栏目内容中上传(最常见)
这是发布文章时,在编辑器里插入图片。
- 进入文章发布页面:在后台找到 “核心” -> “内容发布” -> “添加文档”,或者在前台投稿。
- 使用编辑器上传:
- 在编辑器工具栏中找到 “插入图片” 的图标(通常是一个小山或风景画图标)。
- 点击图标,会弹出一个图片上传窗口。
- 上传图片:
- 在弹出的窗口中,你可以选择 “本地上传” 或 “远程上传”。
- 本地上传:点击“浏览”或“选择文件”,从你的电脑中选择图片,然后点击“开始上传”。
- 上传成功后,图片会显示在列表中,你可以在这里选择图片,设置标题、说明,然后点击“确定”将其插入到文章编辑器中。
- 保存文章:完成文章编辑后,点击“提交”或“保存”按钮,DedeCMS会自动将图片文件移动到你在“步骤一”中配置的
uploads目录下,并将图片的相对路径(如/uploads/images/20251018/123_1.jpg)保存到数据库的dede_archives(文章主表) 和dede_addonarticle(文章附加表) 或相关图片表中。
B. 在自定义表单中上传
如果你创建了自定义表单,并希望在表单中包含图片上传字段。
- 创建表单:在后台 “核心” -> “频道模型” -> “自定义表单” 中创建一个新的表单。
- 添加图片字段:
- 在添加字段时,选择字段类型为 “图片(单选)” 或 “图片(多选)”。
- 保存表单。
- 生成表单页面:使用DedeCMS的标签
{dede:form}在前台页面生成表单。 - 提交表单:用户在前台填写表单并选择图片上传后,点击提交。
- 存储方式:图片同样会上传到
uploads目录,图片的路径会被存储在你为这个图片字段在数据库中对应的那个字段里(imgpic),你可以在后台的 “自定义表单” -> “管理表单” 中查看用户提交的数据,里面会显示图片的路径。
直接上传图片到数据库字段 (不推荐,仅了解)
这种方式比较特殊,适用于一些极小的、不常变动的图标,或者作为Blob二进制数据存储。不推荐用于常规的图片上传,因为它会急剧增加数据库大小,降低查询性能,并且备份和迁移数据也更麻烦。
如何实现(需要手动修改代码和数据库结构)
-
修改数据库表结构:
- 假设你要在文章表
dede_archives中存储图片,你需要为它添加一个LONGBLOB或MEDIUMBLOB类型的字段,my_image。 - 在phpMyAdmin中,找到
dede_archives表,执行SQL语句:ALTER TABLE `dede_archives` ADD `my_image` LONGBLOB NULL;
- 假设你要在文章表
-
修改上传处理程序:
- 你需要找到并修改DedeCMS处理上传的PHP文件(
include/helpers/upload.helper.php)。 - 在这个文件里,你需要编写代码来读取上传的图片文件内容(使用
file_get_contents()),然后将这个二进制数据直接插入到数据库的my_image字段中,而不是保存到服务器硬盘。 - 这部分代码修改比较复杂,需要你对PHP和DedeCMS的底层逻辑有深入了解。
- 你需要找到并修改DedeCMS处理上传的PHP文件(
-
修改显示逻辑:
- 在需要显示这张图片的模板文件(
.htm)中,你不能使用<img src="/uploads/xxx.jpg">。 - 你需要使用PHP代码,从数据库中读取
my_image字段的二进制数据,然后直接输出,通常需要写一个专门的处理页面(image.php?id=文章ID),在这个页面里查询数据库并输出图片头信息和二进制数据。
- 在需要显示这张图片的模板文件(
示例显示逻辑(在模板文件中):
{dede:sql sql="SELECT my_image FROM dede_archives WHERE id=~id~"}
<img src="data:image/jpeg;base64,{base64_encode(my_image)}" alt="从数据库加载的图片" />
{/dede:sql}
或者更推荐的方式,创建一个 show_image.php 文件:
// show_image.php
require_once(dirname(__FILE__)."/include/common.inc.php");
$id = isset($_GET['id']) ? intval($_GET['id']) : 0;
if($id > 0) {
$row = $dsql->GetOne("SELECT my_image FROM dede_archives WHERE id='$id'");
if(is_array($row) && !empty($row['my_image'])) {
// 输出正确的图片MIME类型
header("Content-type: image/jpeg"); // 根据你的图片类型修改
echo $row['my_image'];
exit();
}
}
header("HTTP/1.0 404 Not Found");
然后在模板中调用:
<img src="/show_image.php?id={dede:field.id/}" alt="图片" />
总结与最佳实践
| 特性 | 路径存数据库 (推荐) | 图片存数据库 (不推荐) |
|---|---|---|
| 存储位置 | 图片文件在服务器硬盘,路径在数据库 | 图片二进制数据在数据库 |
| 数据库大小 | 小,只存文本路径 | 急剧增大,影响性能 |
| 网站性能 | 高,数据库查询快,服务器I/O压力小 | 低,大字段查询慢,拖慢整个数据库 |
| 备份与迁移 | 简单,可以分开备份数据库和网站文件 | 复杂,需要导出整个包含巨大二进制数据的数据库 |
| 适用场景 | 99%的场景,文章图片、产品图、用户头像等 | 存储极小的、程序内部使用的图标,或特殊业务需求 |
对于所有常规的DedeCMS网站开发,请务必使用方式一,它是最稳定、最高效、最符合Web开发标准的方式,只有在非常特殊且明确知道其弊端的场景下,才考虑使用方式二。
