【vue】 Tinymce 富文本编辑器 不想让上传的图片转换成base64,而是链接

前言:最近项目上需要使用富文本编辑器,觉得tinymce很不错就用了,具体怎么在项目中使用参考
【vue】 vue2 中使用 Tinymce 富文本编辑器
【vue】 Tinymce 数据 回显问题 | 第一次正常回显后面,显示空白bug不能编辑

这两天又遇到了新的问题,图片上传后是看地址栏发现是base64的,就是下面这样的,
在这里插入图片描述
总体来说呢,这样也没有问题,毕竟图片显示了。但是多个图片上传就会导致响应体太大(后端响应太慢,优化时发现是base64图片太大),所以就想要直接放个链接回显,下面这样

在这里插入图片描述
如何实现?找了很多文章,参考了很长时间终于弄好了,总结一下。
简介与入门 \ 上传图片和文件
vue—tinymce粘贴图片【完美解决】
插件 \ paste 粘贴插件
gitee-wpspaster
tinymce 实现 粘贴图片自动上传

下面具体操作:

我就基于我之前使用tinymce基础上修改了,

第一步:配置粘贴【paste】具体配置项

tinymce.init({
  selector: '#tinydemo',
  plugins: 'paste',
  toolbar: 'paste',
  paste_data_images: true // 默认是false的,记得要改为true才能粘贴
})

第二步:配置图片上传函数

images_upload_handler: (blobInfo, success, failure) => {
  var xhr, formData;
  var file = blobInfo.blob(); //转化为易于理解的file对象
  xhr = new XMLHttpRequest();
  xhr.withCredentials = false;
  // 图片上传路由
  xhr.open("POST", process.env.VUE_APP_BASE_API + "/common/upload");
  xhr.onload = () => {
    var json;
    if (xhr.status != 200) {
      // failure("上传失败: " + xhr.status);
      return;
    }
    json = JSON.parse(xhr.responseText);
    // json是后端返回的数据,其中就包含链接
    if (!json || typeof json.location != "string") {
      // failFun("上传成功:");
      // succFun(json.url);
      success(process.env.VUE_APP_BASE_API + json.fileName);
      return;
    }
  };
  formData = new FormData();
  formData.append("file", file, file.name); //此处与源文档不一样
  xhr.setRequestHeader("Authorization", "Bearer " + getToken());
  xhr.send(formData);
},

下面这段代码是完成系统验证的,可以根据项目调整,不需要可以不加
xhr.setRequestHeader("Authorization", "Bearer " + getToken());

至此,图片渲染就是链接形式了。

### 创建 Vue 中的 TinyMCE 富文本编辑器组件 #### 组件结构设计 为了使 TinyMCE 编辑器能够无缝集成到 Vue 项目中,建议创建一个独立的 `TinymceEditor` 组件。这不仅有助于保持项目的模块化,还便于后续维护和扩展。 #### 安装依赖包 在开始之前,需安装必要的 npm 包来支持本地部署 TinyMCE 而不是使用其云服务: ```bash npm install tinymce vue-tiny-editor --save ``` 此命令会下载 TinyMCE 及适配 Vue 的封装库[^1]。 #### 配置 Tinymce Editor 组件 下面是一个完整的 `TinymceEditor.vue` 文件示例,展示了如何定义并初始化 TinyMCE 实例: ```vue <template> <div class="tinymce-container"> <!-- 使用 v-model 进行双向绑定 --> <editor :init="editorInitConfig" v-model="content"></editor> </div> </template> <script> import { defineComponent, ref } from 'vue'; // 引入 editor 组件 import '@tinymce/tinymce-vue'; export default defineComponent({ name: "TinymceEditor", props: { value: String, }, setup(props) { const content = ref(props.value || ''); // 初始化配置项 const editorInitConfig = { height: 500, menubar: false, plugins: [ 'advlist autolink lists link image charmap print preview anchor', 'searchreplace visualblocks code fullscreen', 'insertdatetime media table paste code help wordcount' ], toolbar: 'undo redo | formatselect | bold italic backcolor | \ alignleft aligncenter alignright alignjustify | \ bullist numlist outdent indent | removeformat | help', branding: false, images_upload_handler(blobInfo, success, failure) { const img = 'data:image/jpeg;base64,' + blobInfo.base64(); success(img); } }; return { content, editorInitConfig }; }, watch: { // 当父级传来的value变化时更新内部状态 value(newValue) { this.content = newValue; }, // 将内容的变化通知给父组件 content(newVal){ this.$emit('input', newVal); } } }); </script> <style scoped> .tinymce-container { width: 100%; } </style> ``` 上述代码实现了基本的功能需求,并且通过自定义上传处理器处理图片等资源文件。 对于特定版本如 Vue2,则可以在 assets 下手动引入所需的 js 和 css 文件,并按照官方文档调整路径设置[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fruge365

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值