WangEditor 安装和使用以及Oss图片视频上传和常见问题(针对Vue2 V5)

本文档详细介绍了如何在Vue2项目中安装和使用WangEditor5,包括基本安装、模版展示、全屏层级问题的解决,以及图片和视频的OSS上传配置。通过实例代码展示了编辑器的初始化、内容异步设置和组件销毁过程,同时提供了自定义上传策略以适应阿里云OSS存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WangEditor v5 官方文档

安装 editor

npm install @wangeditor/editor --save

安装 Vue2 组件(可选)

npm install @wangeditor/editor-for-vue --save

模版

<template>
    <div style="border: 1px solid #ccc;">
        <Toolbar
            style="border-bottom: 1px solid #ccc"
            :editor="editor"
            :defaultConfig="toolbarConfig"
            :mode="mode"
        />
        <Editor
            style="height: 500px; overflow-y: hidden;"
            v-model="html"
            :defaultConfig="editorConfig"
            :mode="mode"
            @onCreated="onCreated"
        />
    </div>
</template>

<script>
import Vue from 'vue'
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'

export default Vue.extend({
    components: { Editor, Toolbar },
    data() {
        return {
            editor: null,
            html: '<p>hello</p>',
            toolbarConfig: { },
            editorConfig: { placeholder: '请输入内容...' },
            mode: 'default', // or 'simple'
        }
    },
    methods: {
        onCreated(editor) {
            this.editor = Object.seal(editor) // 一定要用 Object.seal() ,否则会报错
        },
    },
    mounted() {
        // 模拟 ajax 请求,异步渲染编辑器
        setTimeout(() => {
            this.html = '<p>模拟 Ajax 异步设置内容 HTML</p>'
        }, 1500)
    },
    beforeDestroy() {
        const editor = this.editor
        if (editor == null) return
        editor.destroy() // 组件销毁时,及时销毁编辑器
    }
})
</script>

记得引入 style (忘记加的话工具栏样式会有问题)

<style src="@wangeditor/editor/dist/css/style.css"></style>

或者

import '@wangeditor/editor/dist/css/style.css'

 图片和视频上传(oss上传)

      editor: null,
      html: "<p>hello</p>",
      toolbarConfig: {},
      editorConfig: {
        placeholder: "请输入内容...",
        MENU_CONF: {
          uploadImage: {
            customUpload: this.uploadImg,
            // server: "https://yimiaoyouxi.oss-cn-qingdao.aliyuncs.com/",
            //自定义上-oss
            // this.editor.initSelection();
            customUpload: async (file, insertFn) => {
              const resultUrl = await ossUpload(file, file.name);
              // this.editor.initSelection();
              insertFn(resultUrl, "图片", resultUrl);
              // insertImg(resultUrl);
            },
            // 单个文件的最大体积限制,默认为 2M
            maxFileSize: 6 * 1024 * 1024, // 6M
            // 最多可上传几个文件,默认为 100
            maxNumberOfFiles: 100,
            // 选择文件时的类型限制,默认为 ['image/*'] 。如不想限制,则设置为 []
            allowedFileTypes: ["image/*"],
            // 自定义上传参数,例如传递验证的 token 等。
                参数会被添加到 formData 中,一起上传到服务端。
            meta: {
              // key: "xxx",
              // otherKey: "yyy"
            },
            // 将 meta 拼接到 url 参数中,默认 false
            metaWithUrl: false
            // 超时时间,默认为 10 秒
             timeout: 10 * 1000 // 5 秒
          },
          uploadVideo: {
            allowedFileTypes: ["video/*"],
            customUpload: async (file, insertFn) => {
              const resultUrl = await ossUpload(file, file.name);
              insertFn(resultUrl);
            }
          }
        }
      },
      mode: "default", // or 'simple'
import $http from '@/util/http.js'
const OSS = require("ali-oss");
const api = require('@/util/api.js')
//获取配置的方法
const getListData = async () => {
    let info = await $http.get(api.getOssConfig)
    return {
        accessKeyId:.info.accessid,
        accessKeySecret: info.accessKeySecret,
        stsToken: info.securityToken,
    }
};

//获取配置条件
const client = (data) => {
  return new OSS({
    region: "oss-cn-hangzhou",//这个根据自己项目去填写(地区)
    accessKeyId: data.accessKeyId,//
    accessKeySecret: data.accessKeySecret,
    stsToken: data.stsToken,
    bucket: "xxx", ,//这个根据自己项目去填写
  });
};
//获取uuid随机数作为文件名称
const getFileNameUUID = () => {
  function rx() {
    return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
  }
  return `${+new Date()}_${rx()}${rx()}`;
};
//创建oss上传方法
async function ossUpload(file,module='image') {
  //调用接口,获取配置
    let configInfo = await getListData();
    let fileType = file.type.split("/")[1]
    //拼接文件名称(拼接你需要保存的目录路径,'avatar/'这是我的目录路径)
    var date = new Date();
    let fileNameUrl = `avatar/${await getFileNameUUID()}.${fileType}`;
    let res = await client(configInfo).put(fileNameUrl, file);
    return res.url;
}

export default ossUpload;

关于WangEditor全屏层级的问题

 解决方案(修改文本编辑区域的z-index 堆叠层级)

  .w-e-full-screen-container {
    z-index: 1;
  }

<think>好的,我现在需要在Spring BootVue项目中集成wangeditor,实现图片视频上传功能。首先,我应该了解用户的需求,他们想在前端使用wangeditor富文本编辑器,并且能够上传图片视频到后端服务器,可能还需要处理视频封面。 首先,我需要回忆一下wangeditor的文档相关配置。根据引用[3],用户需要在Vue项目中安装wangeditor,可能还需要安装对应的Vue组件。安装步骤应该是通过npm或yarn安装@wangeditor/editor@wangeditor/editor-for-vue。然后,在Vue组件中引入并使用编辑器。 接下来是前端配置部分。用户需要配置编辑器的上传功能,特别是图片视频上传接口。引用[1][2]提到,图片上传需要调用后端的API,通常是POST请求,使用multipart/form-data格式。可能还需要处理视频上传,类似图片,但需要额外的参数或处理,比如生成封面。引用[4]提到修改wangeditor源码来实现上传视频并获取封面,但用户可能希望不修改源码,所以需要看看wangeditor是否原生支持视频上传配置。 然后是后端部分,Spring Boot需要处理文件上传的接口。根据引用[2][4],后端需要接收multipart/form-data格式的文件,保存到服务器或云存储,并返回文件的URL。可能需要为图片视频分别设置不同的上传接口,或者统一处理。同时,引用[4]提到可能需要处理未引用的文件,但用户当前可能不需要这个功能,可以暂时忽略。 关于视频封面,如果wangeditor不支持自动生成封面,可能需要后端在接收到视频后,提取第一帧作为封面。这可能需要使用Java的库,比如FFmpeg,但集成到Spring Boot中可能比较复杂。用户可能暂时只需要上传视频,封面处理可以后续优化。 现在,整合步骤: 1. Vue前端安装wangeditor并配置上传选项,设置图片视频上传URL指向Spring Boot的后端接口。 2. Spring Boot后端创建文件上传接口,接收文件并保存,返回URL。 3. 处理跨域问题,确保Vue能访问Spring Boot的接口。 4. 测试上传功能,确保图片视频能正确上传并显示在编辑器中。 可能遇到的问题:跨域配置、文件大小限制、存储路径处理、视频封面的生成。根据引用[4],用户可能需要自行处理未使用的文件,但当前问题可能不需要立即解决,先完成基本上传功能。 具体步骤: 前端部分: - 安装wangeditor相关包。 - 在Vue组件中引入编辑器,配置菜单栏,添加上传图片视频的配置,指定后端接口地址。 - 处理上传成功的回调,将返回的URL插入到编辑器中。 后端部分: - 创建Spring Boot的Controller,处理multipart文件上传。 - 保存文件到指定目录,生成唯一文件名避免冲突。 - 返回包含文件URL的JSON响应。 可能还需要配置Spring Boot的文件上传大小限制,在application.properties中设置spring.servlet.multipart.max-file-size等属性。 视频上传部分可能需要检查wangeditor是否支持,如果支持,配置方式与图片类似,指定不同的后端接口。如果不支持,可能需要自定义配置或使用扩展。 最后,测试整个流程,确保文件上传成功,并在编辑器中正确显示。</think>### Spring Boot与Vue整合WangEditor实现文件上传 #### 一、前端Vue配置 1. **安装依赖** 根据引用[^3],安装wangeditor及其Vue组件: ```bash npm install @wangeditor/editor @wangeditor/editor-for-vue ``` 2. **组件集成** 在Vue组件中引入编辑器并配置上传功能: ```vue <template> <div> <Toolbar :editor="editor" /> <Editor v-model="html" :defaultConfig="editorConfig" @onCreated="handleCreated" /> </div> </template> <script> import { Editor, Toolbar } from "@wangeditor/editor-for-vue"; import { uploadImg, uploadVideo } from "@/api/upload"; // 自定义上传API export default { components: { Editor, Toolbar }, data() { return { html: "", editor: null, editorConfig: { MENU_CONF: { uploadImage: { server: "/api/upload/img", // 图片上传接口 fieldName: "file", onSuccess(file, res) { return res.data.url; // 返回图片URL }, }, uploadVideo: { server: "/api/upload/video", // 视频上传接口 fieldName: "file", onSuccess(file, res) { return { src: res.data.url, poster: res.data.poster }; // 返回视频URL封面 }, }, }, }, }; }, methods: { handleCreated(editor) { this.editor = editor; }, }, }; </script> ``` #### 二、后端Spring Boot配置 1. **文件上传接口** 创建Controller处理上传请求: ```java @RestController @RequestMapping("/api/upload") public class FileUploadController { @PostMapping("/img") public ResponseEntity<?> uploadImage(@RequestParam("file") MultipartFile file) { try { String url = FileUtils.saveFile(file, "images"); // 保存到images目录 return ResponseEntity.ok(Map.of("url", url)); } catch (IOException e) { return ResponseEntity.status(500).body("Upload failed"); } } @PostMapping("/video") public ResponseEntity<?> uploadVideo(@RequestParam("file") MultipartFile file) { try { String videoUrl = FileUtils.saveFile(file, "videos"); String posterUrl = VideoUtils.extractFirstFrame(videoUrl); // 生成封面(需FFmpeg支持) return ResponseEntity.ok(Map.of("url", videoUrl, "poster", posterUrl)); } catch (Exception e) { return ResponseEntity.status(500).body("Upload failed"); } } } ``` 2. **文件工具类** ```java public class FileUtils { public static String saveFile(MultipartFile file, String dir) throws IOException { String fileName = UUID.randomUUID() + "_" + file.getOriginalFilename(); Path path = Paths.get("uploads/" + dir, fileName); Files.createDirectories(path.getParent()); Files.write(path, file.getBytes()); return "/uploads/" + dir + "/" + fileName; // 返回访问路径 } } ``` #### 三、关键配置项 1. **跨域支持(Spring Boot)** 在配置类中添加CORS配置: ```java @Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://localhost:8080") // Vue开发服务器地址 .allowedMethods("*"); } } ``` 2. **文件大小限制** 在`application.properties`中设置: ```properties spring.servlet.multipart.max-file-size=50MB spring.servlet.multipart.max-request-size=100MB ``` #### 四、扩展说明 - **视频封面生成**:需集成FFmpeg工具,通过Java调用命令行提取视频第一帧[^4]。 - **云存储优化**:建议使用OSS(如阿里云OSS)替代本地存储,参考引用[^2]的方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值