Golang学习日志 ━━ gin-vue-admin前后端实现tinymce编辑器的上传功能

news2025/1/11 10:04:27

gin-vue-admin是一套国人用golang开发的后台管理系统,总体还是值得推荐的,其前端使用element-ui,后端使用gin框架。
官网:https://www.gin-vue-admin.com/

本文主要描述tinymce的使用,很简单,基本流程如下:

  1. 下载tinymce
  2. 调用tinymce并激活其下载按钮
  3. 配置上传文件及用户授权码
  4. 服务器接收、验证、入库、回传客户端
  5. 客户端接收后显示到tinymce控件中

下载tinymce

复习环境安装:《通过安装Element UI/Plus来学习vue之如何创建项目、搭建vue脚手架、npm下载等》

在gin-vue-admin项目中打开终端,输入:

npm install tinymce --save
npm install @tinymce/tinymce-vue

下载后文件可以在gin-vue-admin/web/node_modules目录中找到对应文件夹。

这样把主版和vue版的都给下载了,根据需要调用主版。
如果出现cloud云端注册的提示,那么可以参考《Element-UI的dialog对话组件内的tinymce弹窗被遮挡的解决办法及其它相关注意事项》中的问题四解决。

调用并配置编辑器

  1. images_upload_url可以激活专门的图片上传功能
  2. file_picker_callback可以激活超链、图片和视频的上传按钮
  3. api/fileUploadAndDownload/upload是gin-vue-admin自带的服务端文件上传功能,需用到用户授权,防止未登录的账号随意上传文件
<template>
	<div>
		<el-form :model="formData" label-position="right" ref="elFormRef" :rules="rule" label-width="80px">
		  <el-form-item label="content字段:"  prop="content" >
		    <Editor
		      :api-key="tinymceApiKey" 
		      :init="tinymceInit" 
		      v-model="formData.content" 
		    />
		  </el-form-item>
		</el-form>
	</div>
</template>
...

<script setup>
...
// import 'tinymce' //如果启用本项,则后续必须手动导入所有皮肤、插件等,并可以不用apikey
import Editor from '@tinymce/tinymce-vue'
// 用户授权用
import { useUserStore } from '@/pinia/modules/user'
// 若无apikey,则可能出现cloud的错误提示
const tinymceApiKey = "123456789abcdefghijklmnopqrstuvwxyz"
const tinymceInit = {
  plugins: 'link image media',
  toolbar: 'link image media',
      
  // images_upload_url: 'api/fileUploadAndDownload/upload', // 有了images_upload_url就有了专门图像上传的功能
  // images_upload_base_path: '/demo', // 控制图像路径
  
  file_picker_types: 'file image media', // 设置本参数可以允许/禁用某分类上传      
  file_picker_callback: function(callback, value, meta) { // 有了file_picker_callback,那么链接、图片和视频都有上传按钮
    //文件分类
    var filetype='.zip, .rar, .7z, .pdf, .txt, .doc, .docx, .xls, .xlsx, .ppt, .pptx, .jpg, .jpeg, .png, .gif, .mp3, .mp4, .mov, .wmv, .avi, .3gp'
    //后端接收上传文件的地址
    var upurl='api/fileUploadAndDownload/upload'
    //为不同插件指定文件类型及后端地址
    switch(meta.filetype){
        case 'image':
            filetype='.jpg, .jpeg, .png, .gif'
            upurl='api/fileUploadAndDownload/upload'
            break;
        case 'media':
            filetype='.mp3, .mp4, .mov, .wmv, .avi, .3gp'
            upurl='api/fileUploadAndDownload/upload'
            break;
        case 'file':
        default:
            filetype='.zip, .rar, .7z, .pdf, .txt, .doc, .docx, .xls, .xlsx, .ppt, .pptx'
            upurl='api/fileUploadAndDownload/upload'
            break;
    }
    //模拟出一个input用于添加本地文件
    var input = document.createElement('input')
    input.setAttribute('type', 'file')
    input.setAttribute('accept', filetype)
    input.click()
    input.onchange = function() {
      var file = this.files[0]

      var xhr, formData
      // console.log(file.name)

      formData = new FormData()
      formData.append('file', file, file.name )

      xhr = new XMLHttpRequest()
      xhr.withCredentials = false
      xhr.open('POST', upurl) // 方式
      
      xhr.setRequestHeader('x-token', userStore.token) // 发送合适的请求头信息,此处为后端身份验证,为必要条件
      
      xhr.onload = function() { // 请求结束后的回传处理
        if (xhr.status != 200) {
            failure('HTTP Error: ' + xhr.status)
            return
        }            
        var json
        json = JSON.parse(xhr.responseText)
        //console.log(json)
        if (!json || typeof json.data.file.url != 'string') {
            failure('Invalid JSON: ' + xhr.responseText)
            return
        }
        callback('http://localhost:8888/'+json.data.file.url, {text: json.data.file.name}); //域名问题这里仅限测试服务器使用
      }
      
      // 发送~~
      xhr.send(formData)
      
      
      // 下面这部分注释为tinymce原生提供学习
      // Provide image and alt text for the image dialog
      /*if (meta.filetype == 'image') {
        callback('myimage.jpg', {alt: 'My alt text'});
      }
      // Provide alternative source and posted for the media dialog
      if (meta.filetype == 'media') {
        callback('movie.mp4', {source2: 'alt.ogg', poster: 'image.jpg'});
      }
      // Provide file and text for the link dialog
      if (meta.filetype == 'file') {
        callback('mypage.html', {text: 'My text'});
      }*/
    
      //下方被注释掉的是官方的一个例子
      //放到下面给大家参考
      
      /*var reader = new FileReader();
      reader.onload = function () {
          // Note: Now we need to register the blob in TinyMCEs image blob
          // registry. In the next release this part hopefully won't be
          // necessary, as we are looking to handle it internally.
          var id = 'blobid' + (new Date()).getTime();
          var blobCache =  tinymce.activeEditor.editorUpload.blobCache;
          var base64 = reader.result.split(',')[1];
          var blobInfo = blobCache.create(id, file, base64);
          blobCache.add(blobInfo);

          // call the callback and populate the Title field with the file name
          callback(blobInfo.blobUri(), { title: file.name });
      };
      reader.readAsDataURL(file);*/
    };        
  },
}
...
</script>

服务器端

本文直接使用api/fileUploadAndDownload/upload,这是gin-vue-admin自带的服务端文件上传功能【媒体库(上传下载)】,大家可以利用该代码改写。
在这里插入图片描述

问题:测试时本地上传视频后提示不支持

问题截图:

返回路径中若为本地视频,则将出现红色警告。
在这里插入图片描述

点击保存后出现如下提示。
在这里插入图片描述

解决办法

本地是不行的,带域名就O了~~
测试视频:http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4
直接复制在地址栏中。
在这里插入图片描述
点击保存后生成超链接。
在这里插入图片描述

参考:
简介与入门 \ 上传图片和文件
tinyMCE版本5.2.1中使用file_picker_callback回调函数自定义文件上传(当然包含图片上传)
XMLHttpRequest.send()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/179509.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Git】Git 的基本使用

Git的简介 Git是一个版本管理控制系统(缩写VCS)&#xff0c;是一个工具&#xff0c;github或者gitee是git命令行工具的网站化。它可以在任何时间点&#xff0c;将文档的状态作为更新记录保存起来&#xff0c;也可以在任何时间点&#xff0c;将更新记录恢复回来。 git的诞生历…

Java 方法

文章目录1. 方法的定义和调用2. 带参方法的定义和调用3. 带返回值方法的定义和调用4. 方法的注意事项5. 方法重载6. 方法的参数传递1. 方法的定义和调用 方法是将具有独立功能的代码块组织成为一个整体&#xff0c;使其具有特殊功能的代码集。 注意&#xff1a; ① 方法必须先…

Linux设置yum命令镜像

本文所有内容基于centos7&#xff0c;理论上对于所有的centos版本都是有效的 使用虚拟机安装linux一般都是默认最小安装&#xff0c;安装完linux之后会发现很多的命令是无法使用的&#xff0c;需要使用yum install进行安装&#xff08;很多博客写使用wget下载yum源&#xff0c…

(Java高级教程)第四章必备前端基础知识-第三节1:JavaScript简介和基础语法

文章目录一&#xff1a;JavaScript简介&#xff08;1&#xff09;JavaScript概述&#xff08;2&#xff09;JavaScript特点&#xff08;3&#xff09;JavaScript运行过程&#xff08;4&#xff09;JavaScript组成&#xff08;5&#xff09;JavaScript的引入方式和基本使用&…

Flask电影网站项目

1 开发环境搭建 1.1 Windows环境 下载Python。下载PyCharm。下载virtualenv。下载MySQL。可以安转一个数据库GUI。 1.2 Linux环境 下载VMware Workstation Pro。下载ubuntu和xshell。 用xshell需要是虚拟机桥接。 下载Python。 pip install 名字 -i https://mirrors.aliy…

图片标签img

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>图片标签img</title> </head> <body bgcolor"beige"><!-- bgcolor 设置网页背景颜色 --> <…

【笔记】transformer

一.前置知识 1.什么是注意力机制 【参考知乎】一文读懂注意力机制 1&#xff09;原理是什么&#xff1f;怎么实现&#xff1f; step&#xff1a; &#xff08;1&#xff09;通过打分函数计算查询向量q和输入h的相关性 &#xff08;2&#xff09;softmax归一化获得注意力分布…

【设计模式】结构型模式·组合模式

学习汇总入口【23种设计模式】学习汇总(数万字讲解体系思维导图) 写作不易&#xff0c;如果您觉得写的不错&#xff0c;欢迎给博主来一波点赞、收藏~让博主更有动力吧&#xff01; 一.概述 又称为部分整体模式&#xff0c;用于把一组相似的对象当作一个单一的对象。组合模式依…

AI医生来啦,ChatGPT在医疗领域的未来可期

最新消息&#xff0c;chatGPT推出了付费版&#xff01;每月&#xff04;42美元&#xff0c;不限流使用&#xff0c;你会付费使用吗&#xff1f;OpenAI 推出的聊天机器人 ChatGPT &#xff0c;获得了巨大的吸引力&#xff0c;目前用户数量超过 100 万。(要知道&#xff0c;Netfl…

2023 Flutter Forward 大会回顾,快来看看 Flutter 的未来会有什么

Flutter Forward 作为一场 Flutter 的突破性发布会&#xff0c;事实上 Flutter 3.7 在大会前已经发布 &#xff0c;所以本次大会更多是介绍未来的可能&#xff0c;核心集中于 come on soon 的支持&#xff0c;所以值得关注的内容很多&#xff0c;特别是一些 Feature 让人十分心…

layui框架学习(1:布局)

Layui是开源的 Web UI 组件库&#xff0c;虽然目前已不算是最主流的前端框架&#xff0c;但很多开源项目都采用Layui设计页面&#xff0c;为了学习相关的项目&#xff0c;同时也为了掌握Layui的基本用法&#xff0c;特此基于B站的Layui教学视频及Layui的官网教程&#xff0c;从…

【DockerCE】使用docker运行HertzBeat

HertzBeat是一款免Agent的监控平台&#xff0c;拥有强大自定义监控能力&#xff0c;可以对应用服务、数据库、中间件、操作系统、云原生等进行监控&#xff0c;配置告警阈值&#xff0c;以及告警通知(邮件微信钉钉飞书)。关于这个软件的介绍&#xff0c;我这里就不做过多的介绍…

在线工具轻松设计电商直通车主图,无需下载

电商直通车主图设计教程&#xff01;无门槛在线设计&#xff0c;零基础轻松入门的电商设计工具&#xff0c;轻松就能搞定的主图设计工具&#xff0c;下面跟着小编的设计教程&#xff0c;一起学习如何使用在线工具乔拓云轻松设计专属的商品直通车主图&#xff0c;在线模板轻松设…

QTableWidget表格使用及美化

QTableWidget使用 选中一行、选中单个目标、禁止编辑 ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);//选中的时候选中一行ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);//只能选中单个目标ui->tableWidg…

C++程序设计——泛型编程、函数模板、类模板

一、泛型编程 假如需要实现一个通用的加法函数&#xff0c;即可以实现多种类型的数据相加。这里当然可以使用函数重载来实现&#xff0c;但是其中会存在一些不好的地方&#xff0c;比如&#xff1a; &#xff08;1&#xff09;重载的函数仅仅是类型不同&#xff0c;代码复用率…

尚硅谷Vue3 笔记总结及代码

✨作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、个人博客 、Github &#x1f389;公众号&#xff1a;猫十二懿 笔记结合了总结视频中总结的内容 尚硅谷张天禹老师课程 空降视频 Vue3官网 1、Vue3简介 1.1 性能的提升 打包大小减少41%初次渲…

从源码解析代理模式

大纲代理模式&#xff08;结构型设计模式&#xff09;通过代理类去访问实现类中的方法&#xff0c;使用场景比如&#xff1a;已有接口和实现类的情况下&#xff0c;想要在已实现的方法基础上扩展更多的功能的场景。代理模式里的主要类&#xff1a;接口实现类&#xff0c;需实现…

数据结构 第三章 栈和队列(栈)

天空之外&#xff1a;点击收听 1 基本知识点 1、栈顶是指允许进行插入和删除操作的一端&#xff0c;另外一端称为栈底 2、进栈是指在栈顶位置插入元素(也叫入栈或者压栈)&#xff0c;出栈是指删除栈顶元素(也叫弹栈或者退栈) 3、栈溢出是指&#xff1a; 当栈满的时候&#x…

led和白炽灯哪个对眼睛好?分享光线舒适的LED护眼灯

最近对于白炽灯与LED灯哪个更护眼的话题受到很多人关注&#xff0c;经过综合考虑&#xff0c;LED灯更适合家庭使用的。 LED灯是电致发光的半导体芯片&#xff0c;抗震性能好&#xff0c;内置三基色荧光粉&#xff0c;让光线更加柔和&#xff0c;做到使用寿命长达10万小时&#…

通信原理简明教程 | 基本概念

文章目录1 通信及通信系统1.1 通信系统的基本组成模型1.2 通信系统的分类1.3 模拟通信和数字通信系统2 调制和解调2.1 调制解调的基本概念2.2 调制解调的分类2.3 调制解调的作用3 通信系统的质量指标3.1 模拟通信系统的质量指标3.2 数字通信系统的质量指标4 总结1 通信及通信系…