vue 集成tinymce2实现图片,视频以及文件的上传

vue 集成tinymce2实现图片,视频以及文件的上传

1. 安装插件

(1)安装tinymce
npm install tinymce -S
(2)安装tinymce-vue
npm install @tinymce/tinymce-vue@3.0.1 -S
2. 复制静态文件到public目录
在这里插入图片描述
资源下载路径:https://download.csdn.net/download/weixin_44021888/88063970?spm=1001.2014.3001.5503
3. 新建组件:tinymce

<template><div class="tinymce-box"><Editor v-model="contentValue" :init="init" :disabled="disabled" @onClick="onClick"/></div>
</template><script>
//引入tinymce编辑器
import Editor from '@tinymce/tinymce-vue'//引入node_modules里的tinymce相关文件文件
import tinymce from 'tinymce/tinymce' //tinymce默认hidden,不引入则不显示编辑器
import 'tinymce/themes/silver'  //编辑器主题,不引入则报错
//import 'tinymce/icons/default'  //引入编辑器图标icon,不引入则不显示对应图标// 引入编辑器插件(基本免费插件都在这儿了)
import 'tinymce/plugins/advlist'  //高级列表
import 'tinymce/plugins/anchor'  //锚点
import 'tinymce/plugins/autolink'  //自动链接
import 'tinymce/plugins/autoresize'  //编辑器高度自适应,注:plugins里引入此插件时,Init里设置的height将失效
import 'tinymce/plugins/autosave'  //自动存稿
import 'tinymce/plugins/charmap'  //特殊字符
import 'tinymce/plugins/code'  //编辑源码
import 'tinymce/plugins/codesample'  //代码示例
import 'tinymce/plugins/directionality'  //文字方向
import 'tinymce/plugins/emoticons'  //表情
import 'tinymce/plugins/fullpage'  //文档属性
import 'tinymce/plugins/fullscreen'  //全屏
import 'tinymce/plugins/help'  //帮助
import 'tinymce/plugins/hr'  //水平分割线
import 'tinymce/plugins/image'  //插入编辑图片
import 'tinymce/plugins/importcss'  //引入css
import 'tinymce/plugins/insertdatetime'  //插入日期时间
import 'tinymce/plugins/link'  //超链接
import 'tinymce/plugins/lists' //列表插件
import 'tinymce/plugins/media' //插入编辑媒体
import 'tinymce/plugins/nonbreaking' //插入不间断空格
import 'tinymce/plugins/pagebreak' //插入分页符
import 'tinymce/plugins/paste' //粘贴插件
import 'tinymce/plugins/preview'//预览
import 'tinymce/plugins/print'//打印
import 'tinymce/plugins/quickbars'  //快速工具栏
import 'tinymce/plugins/save'  //保存
import 'tinymce/plugins/searchreplace'  //查找替换
// import 'tinymce/plugins/spellchecker'  //拼写检查,暂未加入汉化,不建议使用
import 'tinymce/plugins/tabfocus'  //切入切出,按tab键切出编辑器,切入页面其他输入框中
import 'tinymce/plugins/table'  //表格
import 'tinymce/plugins/template'  //内容模板
import 'tinymce/plugins/textcolor'  //文字颜色
import 'tinymce/plugins/textpattern'  //快速排版
import 'tinymce/plugins/toc'  //目录生成器
import 'tinymce/plugins/visualblocks'  //显示元素范围
import 'tinymce/plugins/visualchars'  //显示不可见字符
import 'tinymce/plugins/wordcount'  //字数统计
import Cookies from 'js-cookie'export default {name: 'TEditor',components: {Editor},props: {value: {type: String,default: ''},disabled: {type: Boolean,default: false},plugins: {type: [String, Array],default: 'print preview searchreplace autolink directionality visualblocks visualchars fullscreen image link template code codesample table charmap hr pagebreak nonbreaking anchor insertdatetime advlist lists wordcount textpattern autosave '},toolbar: {type: [String, Array],default: 'fullscreen undo redo restoredraft | cut copy paste pastetext | forecolor backcolor bold italic underline strikethrough link anchor | alignleft aligncenter alignright alignjustify outdent indent | \styleselect formatselect fontselect fontsizeselect | bullist numlist | blockquote subscript superscript removeformat | \table image charmap hr pagebreak insertdatetime print preview | code selectall searchreplace visualblocks | indent2em lineheight formatpainter axupimgs'},},data(){return {init: {language_url: '/tinymce/langs/zh_CN.js',  //引入语言包文件language: 'zh_CN',  //语言类型skin_url: '/tinymce/skins/ui/oxide',  //皮肤:浅色// skin_url: '/tinymce/skins/ui/oxide-dark',//皮肤:暗色plugins: this.plugins,  //插件配置toolbar: this.toolbar,  //工具栏配置,设为false则隐藏// menubar: 'file edit',  //菜单栏配置,设为false则隐藏,不配置则默认显示全部菜单,也可自定义配置--查看 http://tinymce.ax-z.cn/configure/editor-appearance.php --搜索“自定义菜单”fontsize_formats: '12px 14px 16px 18px 20px 22px 24px 28px 32px 36px 48px 56px 72px',  //字体大小font_formats: '微软雅黑=Microsoft YaHei,Helvetica Neue,PingFang SC,sans-serif;苹果苹方=PingFang SC,Microsoft YaHei,sans-serif;宋体=simsun,serif;仿宋体=FangSong,serif;黑体=SimHei,sans-serif;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;',  //字体样式//自带默认字体:'Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats'lineheight_formats: "0.5 0.8 1 1.2 1.5 1.75 2 2.5 3 4 5",  //行高配置,也可配置成"12px 14px 16px 20px"这种形式height: 400,  //注:引入autoresize插件时,此属性失效placeholder: '在这里输入文字',branding: false,  //tiny技术支持信息是否显示resize: false,  //编辑器宽高是否可变,false-否,true-高可变,'both'-宽高均可,注意引号// statusbar: false,  //最下方的元素路径和字数统计那一栏是否显示elementpath: false,  //元素路径是否显示// relative_urls: false,  //false: tinymce将不再自动将文件路径由绝对转为相对// convert_urls: false,  //false: tinymce将不再自动处理文件路径content_style: "img {max-width:100%;}",  //直接自定义可编辑区域的css样式// content_css: '/tinycontent.css',  //以css文件方式自定义可编辑区域的css样式,css文件需自己创建并引入// images_upload_url: '/apib/api-upload/uploadimg',  //后端处理程序的url,建议直接自定义上传函数image_upload_handler,这个就可以不用了// images_upload_base_path: '/demo',  //相对基本路径--关于图片上传建议查看--http://tinymce.ax-z.cn/general/upload-images.phppaste_data_images: true,  //图片是否可粘贴// 只用于上传图片images_upload_handler: (blobInfo, success, failure) => {if(blobInfo.blob().size/1024/1024>3){failure("上传失败,图片大小请控制在 3M 以内")}else{this.uploadFileData(blobInfo.blob(), success,)                     }},// 用于上传文件或视频,文件进行了分片上传file_picker_callback: function(callback, value, meta) {let url = `${window.SITE_CONFIG['apiURL']}/resource/o_upload?token=${Cookies.get('token')}`//文件if(meta.filetype == 'media' || meta.filetype == 'file'){  let input = document.createElement('input');//创建一个隐藏的inputinput.setAttribute('type', 'file');let that = this;input.onchange = function(){let file = this.files[0];//选取第一个文件let chunkSize = 1024 * 1024 * 10; // 每个块的大小(字节),10Mlet fileSize = file.size; // 文件的总大小let totalChunks = Math.ceil(fileSize / chunkSize); // 文件被分成的总块数let chunkNumber = 0; // 当前上传的块的编号let startByte = 0; // 当前上传块的起始字节位置let endByte = chunkSize; // 当前上传块的结束字节位置(不包括)uploadChunk()function uploadChunk() {let chunk = file.slice(startByte, endByte); // 获取当前上传块的内容let params = new FormData()//params.append('file',blobInfo.blob())params.append('file', chunk);params.append("chunkNumber", chunkNumber);params.append("totalChunks", totalChunks);params.append("fileName", file.name);const xhr = new XMLHttpRequest();xhr.open("POST", url, true);// 监听XMLHttpRequest对象的事件xhr.onload = function() {if (xhr.status === 200) {// 上传成功,继续上传下一块chunkNumber++;startByte = endByte;endByte = Math.min(startByte + chunkSize, fileSize);if (startByte < fileSize) {uploadChunk();} else {// 所有块上传成功// 上传的图片callback(`${window.SITE_CONFIG['apiURL']}` +JSON.parse(xhr.response).data.resourceUrl , { title: file.name })}} else {// 上传失败,尝试重传当前块console.error(xhr.statusText);setTimeout(uploadChunk, 1000);}};xhr.onerror = function() {// 网络错误,尝试重传当前块console.error(xhr.statusText);setTimeout(uploadChunk, 1000);};// 发送POST请求xhr.send(params);}}//触发点击input.click();}},},contentValue: this.value}},watch: {value (newValue) {this.contentValue = newValue},contentValue (newValue) {this.$emit('input', newValue)},},mounted(){tinymce.init({})},methods: {// 添加相关的事件,可用的事件参照文档=> https://github.com/tinymce/tinymce-vue => All available eventsonClick(e){this.$emit('onClick', e, tinymce)},//清空内容clear(){this.contentValue = ''},uploadFileData(file, success) {let url = `${window.SITE_CONFIG['apiURL']}/resource/o_upload?token=${Cookies.get('token')}`let chunkSize = 1024 * 1024 * 10; // 每个块的大小(字节),10Mlet fileSize = file.size; // 文件的总大小let totalChunks = Math.ceil(fileSize / chunkSize); // 文件被分成的总块数let chunkNumber = 0; // 当前上传的块的编号let startByte = 0; // 当前上传块的起始字节位置let endByte = chunkSize; // 当前上传块的结束字节位置(不包括)uploadChunk()function uploadChunk() {let chunk = file.slice(startByte, endByte); // 获取当前上传块的内容let params = new FormData()//params.append('file',blobInfo.blob())params.append('file', chunk);params.append("chunkNumber", chunkNumber);params.append("totalChunks", totalChunks);params.append("fileName", file.name);const xhr = new XMLHttpRequest();xhr.open("POST", url, true);// 监听XMLHttpRequest对象的事件xhr.onload = function() {if (xhr.status === 200) {// 上传成功,继续上传下一块chunkNumber++;startByte = endByte;endByte = Math.min(startByte + chunkSize, fileSize);if (startByte < fileSize) {uploadChunk();} else {// 所有块上传成功// 上传的图片success(`${window.SITE_CONFIG['apiURL']}` +JSON.parse(xhr.response).data.resourceUrl)}} else {// 上传失败,尝试重传当前块console.error(xhr.statusText);setTimeout(uploadChunk, 1000);}};xhr.onerror = function() {// 网络错误,尝试重传当前块console.error(xhr.statusText);setTimeout(uploadChunk, 1000);};// 发送POST请求xhr.send(params);}}},
}
</script>

注意:如果上传过后的视频,只有一张图片的占位符,就把plugins和toolbar这两个属性里面的media去掉就可以了

plugins: {type: [String, Array],default: 'print preview searchreplace autolink directionality visualblocks visualchars fullscreen image link template code codesample table charmap hr pagebreak nonbreaking anchor insertdatetime advlist lists wordcount textpattern autosave '
},
toolbar: {type: [String, Array],default: 'fullscreen undo redo restoredraft | cut copy paste pastetext | forecolor backcolor bold italic underline strikethrough link anchor | alignleft aligncenter alignright alignjustify outdent indent | \styleselect formatselect fontselect fontsizeselect | bullist numlist | blockquote subscript superscript removeformat | \table image charmap hr pagebreak insertdatetime print preview | code selectall searchreplace visualblocks | indent2em lineheight formatpainter axupimgs'
}

在这里插入图片描述

这篇文章还存在一个问题就是,切换tab后,再次打开这个编辑器,就不显示之前的值以及无法点击,百度查询说是用:key,并在actived方法中每次更新这个key对应的值,但是我做了不起作用
有解决方法的朋友辛苦告知一下

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【116个】网络安全测试相关面试真题

1、Burpsuite常用的功能是什么&#xff1f; 2、reverse_tcp和bind_tcp的区别&#xff1f; 3、拿到一个待检测的站或给你一个网站&#xff0c;你觉得应该先做什么&#xff1f; 4、你在渗透测试过程中是如何敏感信息收集的&#xff1f; 5、你平时去哪些网站进行学习、挖漏洞提交到…

git rebase 合并提交

一. 合并提交步骤 git log --oneline 查看当前提交记录 git rebase -i HEAD~2 选择最后提交的2条记录进行合并进入编辑界面,将c865404的pick改为f, 表示向前合并也就是向cc5a54合并 编辑完之后:wq 保存并退出git rebase --continuegit push --force origin feature/v1.2 推送…

Python venv 和 virtualenv 虚拟环境的基本使用

1.前言 venv 和 virtualenv 都是搭建虚拟环境的工具&#xff0c;virtualenv 是第三方开源的&#xff0c;而 venv 作为 virtualenv 的一个子集自 Python3.3 开始集成到标准库中&#xff0c;在 virtualenv 的文档中可以看到他们的区别&#xff1a; 没有 app-data 种子方法&#…

WEB APIs day4 (1)

一、日期对象 1.实例化 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevi…

MySQL(十):MySQL语法-进阶

MySQL语法-进阶 数据类型Text 类型Number 类型Date 类型 ASALTER TABLEconcat、group_concatSQL注入阻止SQL注入方案一方案二方案三 HAVING 子句临时表正则表达式获取服务器元数据事务导出数据导出数据导出表作为原始数导出SQL格式的数据 导入数据解决无法导入问题使用 LOAD DA…

VS工程项目中属性中无Qt设置问题解决方案

VS工程项目中属性中无Qt设置问题解决方案 若VS工程中&#xff0c;创建的是Qt工程&#xff0c;或者从Qt Creator工程转换为VS 工程时&#xff0c;VS项目属性中确无Qt Project Setttings等设置时&#xff0c;可通过如下方案解决 1. 右键项目&#xff0c;在下拉框中选择Qt项 2.…

肯尼亚税务局如何利用RPA、AI等创新技术来推动税务合规增加税收?

在当今的数字化时代&#xff0c;税务部门的工作变得日益复杂。依赖手动程序为税务部门带来了巨大的困难&#xff0c;这使得在有效管理税收和实现收入目标上遇到了阻碍。手动流程往往效率低下&#xff0c;易出错&#xff0c;而且难以应对大规模的数据处理需求。如果不能解决该问…

Spring MVC相关注解运用 —— 中篇

目录 一、RESTful风格支持 1.1 RESTful风格介绍 1.2 postman使用 二、PathVariable 2.1 实例程序 2.2 测试结果 三、PostMapping、GetMapping、PutMapping、DeleteMapping 四、HiddenHttpMethodFilter 4.1 在web.xml配置过滤器 4.2 控制器方法 4.3 JSP页面 4.4 测…

Docker 仓库与注册表: 构建可靠的容器镜像生态系统

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

使用NVIDIA FX Composer验证多纹理合成效果

最近项目上有一个需求&#xff0c;需要将4张带透明通道纹理合成为一张&#xff0c;并且每张纹理指定一个全局透明度。由于纹理过多&#xff0c;合成效果无法保证&#xff0c;为了减少项目的风险&#xff0c;领导希望我先快速验证一下我们讨论的方法是否能完成项目的要求。因此我…

【数据结构】链表及无头单向非循环链表实现

目录 1.顺序表的问题 2.链表的概念、结构及分类 3.无头单向非循环链表实现 3.1创建节点 3.2头插数据 3.3头删数据 3.4尾插 3.5尾删 3.6链表销毁 3.7查找一个元素 3.8在pos之前插入 3.9在pos之后插入 3.10删除pos位置 3.11删除pos之后的位置 1.顺序表的问题 顺…

【Spring | 应用上下文】

应用上下文 应用上下文和资源路径构造应用上下文构造ClassPathXmlApplicationContext实例 — 快捷方式使用通配符蚂蚁式图案类路径&#xff1a;前缀 应用上下文和资源路径 本节介绍如何使用资源创建应用程序上下文&#xff0c;包括使用 XML 的快捷方式、如何使用通配符以及其…