dede手工上传按钮如何使用?

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

在文章编辑页添加一个简单的上传按钮(最常用)

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

dede手工上传按钮
(图片来源网络,侵删)

实现步骤:

  1. 找到并修改模板文件 DedeCMS的文章发布页模板文件位于 /dede/templets/ 目录下,我们需要修改的是 article_add.htm(用于新增文章)和 article_edit.htm(用于编辑文章)。

  2. 添加上传按钮的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>
  3. 编写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>

代码解释:

dede手工上传按钮
(图片来源网络,侵删)
  • 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弹窗,或者需要更复杂的功能(如多图上传、显示上传进度等),你可以自己编写一个完整的前后端上传流程。

dede手工上传按钮
(图片来源网络,侵删)

前端部分 (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函数,适合快速添加一个图片/附件上传按钮。
  • 方法二:是方法一的扩展,用于上传不同类型的文件。
  • 方法三:最灵活,功能最强大,但需要编写较多的前端和后端代码,适合有特殊需求(如进度条、多图上传、自定义验证规则等)的场景。

对于绝大多数用户来说,方法一已经足够满足“手工上传按钮”的需求。

-- 展开阅读全文 --
头像
织梦编辑器乱码怎么解决?
« 上一篇 今天
C语言如何实现substr函数?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码