【富文本编辑器】原生JS使用WangEditor和vue上传图片前后端demo

【富文本编辑器】原生JS使用WangEditor上传图片前后端demo

  • [第一步 HTML](#第一步 HTML)
  • [第二步 初始化WangEditor与图片上传回调函数](#第二步 初始化WangEditor与图片上传回调函数)
  • [第三步 后端返回数据体封装](#第三步 后端返回数据体封装)
  • [第四步 后端接口上传图片,并返回图片地址](#第四步 后端接口上传图片,并返回图片地址)

  最近,我遇到了这样一个问题:因为我们的项目是基于比较陈旧的技术搭建的,暂时也没有足够的时间去进行大规模的迭代更新,比如将其改造成前后端分离的架构。但是项目要引入富文本编辑器,所以就比较难受了。

  我们项目中的Vue 2是通过JS文件引入的,所以我们找一个既能兼容我们现有架构,又具有详尽文档、支持JS文件引入的富文本编辑器。在经过一番筛选后,我最终选择了WangEditor。感兴趣可以查看它的官方文档:https://www.wangeditor.com/v5/。

  今天实现了WangEditor的图片上传功能。这里贴出来demo方便大家直接用。

第一步 HTML

  老项目一般都用Bootstrap的布局特性来构建用户界面。首先,我在代码的上半部分定义了富文本编辑器的样式和功能。

  接着,在代码的下半部分,我设置了Vue的提交按钮。

python 复制代码
<div class="card-body">
    <div id="editor---wrapper">
        <div id="toolbar-container"><!-- 工具栏 --></div>
        <div id="editor-container"><!-- 编辑器 --></div>
    </div>
</div>

<div class="card-body" id="app">
   <button class="btn btn-success center" @click="handleAdd">保存并提交</button>
</div>

第二步 初始化WangEditor与图片上传回调函数

  使用 window.wangEditor 对象中的 createEditor 和 createToolbar 方法来创建编辑器和工具栏。

  最重要的是图片上传配置:editor.getConfig().MENU_CONF['uploadImage'] 用于设置图片上传的相关配置。包括服务器端点、字段名称和成功上传时的回调函数。

javascript 复制代码
<script type="module">
    const { createEditor, createToolbar } = window.wangEditor

    const editorConfig = {
        placeholder: 'Type here...',
        onChange(editor) {
            const html = editor.getHtml()
            console.log('editor content', html)
            // 也可以同步到 <textarea>
        }
    }

    const editor = createEditor({
        selector: '#editor-container',
        html: '<p><br></p>',
        config: editorConfig,
        mode: 'default', // or 'simple'
    })

    const toolbarConfig = {
        excludeKeys: ["fullScreen"]
    }

    const toolbar = createToolbar({
        editor,
        selector: '#toolbar-container',
        config: toolbarConfig,
        mode: 'default', // or 'simple'
    })

    editor.getConfig().MENU_CONF['uploadImage'] = {
        server: '/file/upload-image',
        fieldName: 'file',
        onSuccess(file, res) {          // JS 语法
            console.log(file, res)
            console.log(`${file.name} 上传成功`, res)
        },
    }


    new Vue({
        el: '#app',
        name: "Editor",
        data: {

        },
        mounted: function () {   //自动触发写入的函数

        },
        created: function () {

        },
        methods: {
            handleAdd: function () {
                console.log(editor.getHtml())
            }
        }
    })

</script>

第三步 后端返回数据体封装

  官网对回调函数接受的结果有格式要求,下面封装一下消息体:

java 复制代码
public class FileUploadResult {
    private int errno;
    private String message;
    private ImgUploadResult data;

    public FileUploadResult() {
        this.errno = 1;
        this.message = "上传失败";
    }

    public FileUploadResult(String url) {
        this.errno = 0;
        this.message = "上传成功";
        this.data = new ImgUploadResult(url);
    }

    public static FileUploadResult success(String url) {
        return new FileUploadResult(url);
    }

    public static FileUploadResult fail() {
        return new FileUploadResult();
    }

    public int getErrno() {
        return errno;
    }

    public void setErrno(int errno) {
        this.errno = errno;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public ImgUploadResult getData() {
        return data;
    }

    public void setData(ImgUploadResult data) {
        this.data = data;
    }
}

public class ImgUploadResult {
    private String url;
    private String alt;
    private String href;

    public ImgUploadResult(String url) {
        this.alt = "";
        this.href = "";
        this.url = url;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getAlt() {
        return alt;
    }

    public void setAlt(String alt) {
        this.alt = alt;
    }

    public String getHref() {
        return href;
    }

    public void setHref(String href) {
        this.href = href;
    }
}

第四步 后端接口上传图片,并返回图片地址

  最后在接口里面上传图片,再把图片地址返回回去。

java 复制代码
@PostMapping("/upload-image")
    public FileUploadResult uploadImage(@RequestParam(value = "file", required = true) MultipartFile file) throws IOException {
        String url = FileUploadUtils.upload(
	        ProjectConfig.getUploadPath(), 
	        file,
        	MimeTypeUtils.IMAGE_EXTENSION
        );

        return FileUploadResult.success(url);
    }
相关推荐
用户360055579004 分钟前
Kestrel_VLLM - 26 · 发射空档三步曲:事件计时 → nsys → 判别实验
前端
echome8888 分钟前
JavaScript async/await 错误处理:别让 Promise 静默失败
开发语言·前端·javascript·promise
PedroQue9925 分钟前
v0.2.0 架构升级:class + reactive 重塑状态管理
前端·uni-app
鶴哥只手遮天25 分钟前
Angular 22 源码级深度解析-第 02 章 编译链路总览:从模板字符串到 `ɵɵ` 指令
前端·开源·angular.js
尘世中一位迷途小书童25 分钟前
别再堆万字 Prompt:用 Agent Skills 给团队写一个「前端 Review」Skill
前端·ai编程·cursor
aixingpan27 分钟前
aixingpan.cn API开发文档:api_docs_bichart_common2接口指南
前端·php
super_Omni30 分钟前
text/PDF/Word → 解析成纯文本 → 分词 → 词表匹配 → 加权打分 → 低于阈值
前端·chrome
阶进遐34 分钟前
浏览器工具自制指南·对话导出(3):消息池设计
前端
SameX38 分钟前
HarmonyOS 用 relationalStore 做阅读统计 App —— 5 张表背后的 5 个 schema 决策
前端
LV技术派1 小时前
【成为 AI Native Builder · 02】什么是 AI Native Builder:一个人 + AI,交付完整闭环
前端·程序员·ai编程