在文章编辑页添加一个简单的上传按钮(最常用)
这是最常见的需求,即在发布文章的页面上,添加一个按钮,点击后可以上传图片,并自动将图片路径插入到编辑器光标位置。

(图片来源网络,侵删)
实现步骤:
-
找到并修改模板文件 DedeCMS的文章发布页模板文件位于
/dede/templets/目录下,我们需要修改的是article_add.htm(用于新增文章)和article_edit.htm(用于编辑文章)。 -
添加上传按钮的HTML代码 在
article_add.htm文件中,找到编辑器所在的位置(通常是一个<textarea>或一个<div id="myEditor">),在它附近,比如<table>的某个<tr>中,添加以下HTML代码:<tr> <td height="24" colspan="2" class="bline"> <strong>快速上传图片:</strong> <input type="button" name="quickUpload" id="quickUpload" value="选择图片" class="coolbg np" /> <span id="quickUploadStatus" style="color:red;"></span> </td> </tr> -
编写JavaScript处理代码 在
article_add.htm文件的底部,通常有一个<script>标签区域,在其中添加以下JavaScript代码,这段代码负责处理按钮点击事件、调用DedeCMS的上传接口,并将返回的图片路径插入到编辑器中。<script type="text/javascript"> // 确保在DOM加载完成后执行 jQuery(document).ready(function($) { // 绑定按钮点击事件 $('#quickUpload').click(function() { // 调用DedeCMS内置的弹出式上传窗口 // 'img' 是上传类型,表示图片 // 'litpic' 是返回值插入的input框的ID,这里我们直接插入到编辑器,所以可以写一个不存在的ID,然后在回调里处理 // '1' 是是否限制宽高,1表示限制 // '250' 是限制的宽度 // '250' 是限制的高度 OpenUploadWin('img', 'quickUploadCallback', '1', '250', '250'); }); // 定义回调函数,用于处理上传成功后的返回值 // 这个函数名 'quickUploadCallback' 必须和上面 OpenUploadWin 的第三个参数保持一致 function quickUploadCallback (imgpath, imgwidth, imgheight) { // imgpath 是上传后图片的完整路径,如 /uploads/202510/10/xxx.jpg // 1. 将图片路径插入到编辑器中 // 获取UEditor编辑器实例 var editor = UE.getEditor('body'); editor.ready(function() { // 在光标位置插入图片 editor.execCommand('inserthtml', '<img src="' + imgpath + '" alt="" />'); }); // 2. (可选) 将图片路径填充到“缩略图”输入框 // 如果你的缩略图input框id是 'litpic' // $('#litpic').val(imgpath); // 3. 显示上传成功提示 $('#quickUploadStatus').text('图片上传成功: ' + imgpath); } }); </script>
代码解释:

(图片来源网络,侵删)
OpenUploadWin(): 这是DedeCMS内置的JavaScript函数,用于弹出文件选择窗口。img: 上传文件类型,可以是img(图片)、media(多媒体/视频)、file(附件)等。quickUploadCallback: 上传成功后调用的JavaScript函数名。- 后面的参数是关于图片尺寸限制的。
quickUploadCallback(): 这是我们自己定义的回调函数,当你在上传窗口选择文件并确认上传后,DedeCMS会自动调用这个函数,并把图片路径等信息作为参数传过来。UE.getEditor('body'): 获取DedeCMS默认使用的百度编辑器(UEditor)的实例。'body'是编辑器<textarea>的id。editor.execCommand('inserthtml', ...): 在编辑器中执行插入HTML内容的命令,这里是插入一个<img>
上传其他类型的文件(如附件、视频)
如果你想上传的是附件(如.zip, .pdf)或视频,方法类似,只需要修改OpenUploadWin的第一个参数即可。
修改JavaScript代码:
<script type="text/javascript">
jQuery(document).ready(function($) {
// 上传附件
$('#quickUploadFile').click(function() {
OpenUploadWin('file', 'quickFileUploadCallback', '0', '', '');
});
function quickFileUploadCallback (filepath) {
var editor = UE.getEditor('body');
editor.ready(function() {
// 插入一个下载链接
editor.execCommand('inserthtml', '<a href="' + filepath + '" target="_blank">点击下载附件</a>');
});
$('#quickUploadStatus').text('附件上传成功: ' + filepath);
}
// 上传视频
$('#quickUploadVideo').click(function() {
OpenUploadWin('media', 'quickVideoUploadCallback', '0', '', '');
});
function quickVideoUploadCallback (videopath, videowidth, videoheight) {
var editor = UE.getEditor('body');
editor.ready(function() {
// 插入视频标签(这里用HTML5 video标签为例)
editor.execCommand('inserthtml', '<video src="' + videopath + '" width="600" controls></video>');
});
$('#quickUploadStatus').text('视频上传成功: ' + videopath);
}
});
</script>
对应的HTML按钮:
<input type="button" name="quickUploadFile" id="quickUploadFile" value="上传附件" class="coolbg np" /> <input type="button" name="quickUploadVideo" id="quickUploadVideo" value="上传视频" class="coolbg np" />
完全自定义的上传接口(更灵活)
如果你不想使用DedeCMS内置的OpenUploadWin弹窗,或者需要更复杂的功能(如多图上传、显示上传进度等),你可以自己编写一个完整的前后端上传流程。

(图片来源网络,侵删)
前端部分 (HTML + JavaScript):
<!-- 在模板文件中添加 -->
<tr>
<td height="24" colspan="2" class="bline">
<strong>自定义上传:</strong>
<input type="file" id="myCustomFile" name="myCustomFile" />
<button id="uploadBtn">上传</button>
<div id="uploadProgress"></div>
<div id="uploadResult"></div>
</td>
</tr>
<script type="text/javascript">
document.getElementById('uploadBtn').addEventListener('click', function() {
var formData = new FormData();
var fileInput = document.getElementById('myCustomFile');
var file = fileInput.files[0];
if (!file) {
alert('请选择一个文件');
return;
}
formData.append('file', file);
// 显示进度条
var progressDiv = document.getElementById('uploadProgress');
progressDiv.innerHTML = '上传中...';
// 使用 AJAX 发送文件
var xhr = new XMLHttpRequest();
xhr.open('POST', '/dede/upload.php', true); // 注意:这里指向一个你自定义的上传处理文件
xhr.upload.onprogress = function(e) {
if (e.lengthComputable) {
var percent = Math.round((e.loaded / e.total) * 100);
progressDiv.innerHTML = '上传进度: ' + percent + '%';
}
};
xhr.onload = function() {
if (xhr.status === 200) {
var response = JSON.parse(xhr.responseText);
if (response.success) {
var editor = UE.getEditor('body');
editor.ready(function() {
editor.execCommand('inserthtml', '<img src="' + response.file_url + '" alt="" />');
});
document.getElementById('uploadResult').innerHTML = '上传成功!路径:' + response.file_url;
} else {
document.getElementById('uploadResult').innerHTML = '上传失败:' + response.message;
}
} else {
document.getElementById('uploadResult').innerHTML = '上传失败,服务器错误。';
}
progressDiv.innerHTML = '';
};
xhr.send(formData);
});
</script>
后端部分 (PHP - /dede/upload.php):
你需要创建一个PHP文件来处理上传,这个文件需要放在DedeCMS后台目录下,并且要引入DedeCMS的核心文件以获得安全验证和上传配置。
<?php
/**
* 自定义文件上传处理脚本
* 保存于 /dede/upload.php
*/
// 引入DedeCMS配置和核心文件
require_once(dirname(__FILE__) . "/config.php");
require_once(DEDEINC . "/dedetag.class.php");
require_once(DEDEINC . "/uploadsafe.inc.php");
// 检查用户是否登录
if(empty($cuserLogin)) {
exit(json_encode(['success' => false, 'message' => '请先登录']));
}
// 定义允许的文件类型和大小
$allowTypes = ['image/jpeg', 'image/png', 'image/gif'];
$maxSize = 5 * 1024 * 1024; // 5MB
if (isset($_FILES['file']) && $_FILES['file']['error'] == 0) {
$file = $_FILES['file'];
// 检查文件大小
if ($file['size'] > $maxSize) {
exit(json_encode(['success' => false, 'message' => '文件大小超过限制']));
}
// 检查文件类型
if (!in_array($file['type'], $allowTypes)) {
exit(json_encode(['success' => false, 'message' => '文件类型不允许']));
}
// 使用DedeCMS的安全上传函数处理文件
// $cfg_upload_savepath 在 /data/config.cache.inc.php 中定义
$uploadPath = $cfg_upload_savepath . 'manual/'. date('Ym/d/'); // 按日期创建目录
if (!is_dir($uploadPath)) {
mkdir($uploadPath, 0777, true);
}
// 生成随机文件名
$fileExt = pathinfo($file['name'], PATHINFO_EXTENSION);
$newFileName = md5(time() . $file['name']) . '.' . $fileExt;
$filePath = $uploadPath . $newFileName;
// 移动上传的文件
if (move_uploaded_file($file['tmp_name'], $filePath)) {
// 返回成功信息和文件相对路径
// $cfg_cmspath 是网站根目录,如 /dedecms
$relativePath = str_replace($cfg_cmspath, '', $filePath);
exit(json_encode([
'success' => true,
'file_url' => $relativePath,
'message' => '上传成功'
]));
} else {
exit(json_encode(['success' => false, 'message' => '文件移动失败']));
}
} else {
exit(json_encode(['success' => false, 'message' => '没有接收到文件']));
}
?>
- 方法一(推荐):最简单,直接利用DedeCMS的
OpenUploadWin函数,适合快速添加一个图片/附件上传按钮。 - 方法二:是方法一的扩展,用于上传不同类型的文件。
- 方法三:最灵活,功能最强大,但需要编写较多的前端和后端代码,适合有特殊需求(如进度条、多图上传、自定义验证规则等)的场景。
对于绝大多数用户来说,方法一已经足够满足“手工上传按钮”的需求。
