springboot结合WangEditor富文本编辑器上传图片(包含后台)

该博客记录了基于springboot+thymeleaf环境,结合WangEditor进行开发的过程。前端使用textarea并添加图片上传功能,给出了完整代码。后台代码需按特定格式返回上传成功数据,还需取配置文件的值,后续会结合七牛云。

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

环境:
springboot+thymeleaf
application.yml代码如下:

file:
  uploadPath: E:\\images\\
  #  uploadPath: imgupload/
  accessPath: /upload/markPic/

配置文件:

@Configuration
class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        String os = System.getProperty("os.name");
        //如果是Windows系统
        if (os.toLowerCase().startsWith("win")) {
            registry.addResourceHandler("/upload/markPic/**")
                    //项目外路径
                    .addResourceLocations("file:E:/images/");

        } else {  //linux 和mac
            registry.addResourceHandler("/img/**")
                    .addResourceLocations("file:/webapps/img");
        }
    }
}

根据WangEditor开发文档,在前端写
这里我有用到textarea,所以

<div id="div1">
    <p>欢迎使用 <b>wangEditor</b> 富文本编辑器</p>
</div>
<textarea id="text1" style="width:100%; height:200px;"></textarea>

<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<script type="text/javascript" src="//unpkg.com/wangeditor/dist/wangEditor.min.js"></script>
<script type="text/javascript">
    const E = window.wangEditor
    const editor = new E('#div1')
    const $text1 = $('#text1')
    editor.config.onchange = function (html) {
        // 第二步,监控变化,同步更新到 textarea
        $text1.val(html)
    }
    editor.create()

    // 第一步,初始化 textarea 的值
    $text1.val(editor.txt.html())
</script>

再加上图片上传,因此完整的代码如下(这里JS我引入的是本地的):

<!-- 引用js -->
<script src="/resources/js/jquery.min.js"></script>
<script type="text/javascript" src="/resources/js/wangEditor.min.js"></script>
<script>
    const E = window.wangEditor
    const editor = new E('#div1')
    const $text1 = $('#text1')

    editor.config.debug = true;
    editor.config.uploadFileName = 'file';
    editor.config.uploadImgMaxLength = 5 // 一次最多上传 5 个图片
    editor.config.uploadImgServer = '/file/uploadEditor';
    editor.config.onchange = function (html) {
        $text1.val(html)
    }

    editor.create();
    // 初始化 textarea 的值
    $text1.val(editor.text.html())
</script>

接下来是后台的代码:根据开发文档,上传成功需要返回的格式为:
成功返回示例:{“errno”: 0,// data 是一个数组,返回图片的线上地址
“data”: [
“图片1地址”,
“图片2地址”,
“……”
]}
因此,我们返回的数据也要对应。

    /**
     * 富文本编辑器上传
     * @param request
     * @param files
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "/uploadEditor", method = RequestMethod.POST)
    public JSONObject uploaduploadEditor(HttpServletRequest request, @RequestParam("file") MultipartFile[] files) throws Exception {
        //这里能直接得到文件数组
        List filePathList = new ArrayList<>();
        JSONObject res = new JSONObject();
        if (files == null) {
            throw new IOException("上传失败:文件为空");
        }
        for (MultipartFile file : files) {
            //服务器路径加项目名称
            String imageUrl = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
            //图片真实路径
            String fileRealPath = file.getOriginalFilename();
            String suffix = fileRealPath.substring(fileRealPath.lastIndexOf("."));
            String fileName = System.currentTimeMillis()+"_" +suffix;
            //把服务器路径和图片路径拼接起来
            String path = uploadPath;
            File targetFile = new File(path, fileName);
            Object filePath =  accessPath+fileName;
            if(!targetFile.exists()){
                try {
                    targetFile.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            try {
                file.transferTo(targetFile);
            } catch (Exception e) {
                e.printStackTrace();
            }
            //成功返回示例:{"errno": 0,// data 是一个数组,返回图片的线上地址
            //    "data": [
            //        "图片1地址",
            //        "图片2地址",
            //        "……"
            //    ]}
//            {"errno":0,"data":"/upload/markPic/1610434244822_.jpg"}
            filePathList.add(filePath);
        }
        res.put("errno",0);
        res.put("data",filePathList);
        System.out.println(res);
        return res;
    }

还需要取配置文件的值:

@Value("${file.uploadPath}")
String uploadPath;  //项目地址
@Value("${file.accessPath}")
String accessPath;   //虚拟地址

结果图:
在这里插入图片描述

简单记录一下,晚点会结合七牛云。
不足之处,请多多提出意见,共同进步!

这是一个使用SpringBoot和Vue3构建的前后端分离的后台管理系统。后端使用SpringBoot框架,前端使用Vue3和Element Plus组件库,数据库使用MySQL。你可以下载源代码并在IDE中加载运行。以下是该系统的一些特点和功能: 1.使用Spring Security进行身份验证和授权,保护系统安全。 2.使用Mybatis-Plus进行数据库操作,简化了SQL语句的编写。 3.使用Vue Router进行路由管理,实现了单页面应用。 4.使用Element Plus组件库,提供了丰富的UI组件和交互效果。 5.使用wangEditor富文本编辑器,方便用户编辑富文本内容。 6.实现了用户管理、角色管理、权限管理、日志管理等功能。 以下是该系统的部分代码示例: 1.后端使用SpringBoot框架,使用Mybatis-Plus进行数据库操作: ```java @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { @Override public User getUserByUsername(String username) { QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("username", username); return getOne(wrapper); } } ``` 2.前端使用Vue3和Element Plus组件库,实现了用户管理页面: ```vue <template> <div class="user"> <el-table :data="users" style="width: 100%"> <el-table-column prop="id" label="ID"></el-table-column> <el-table-column prop="username" label="用户名"></el-table-column> <el-table-column prop="email" label="邮箱"></el-table-column> <el-table-column prop="phone" label="电话"></el-table-column> <el-table-column prop="createTime" label="创建时间"></el-table-column> <el-table-column label="操作"> <template #default="{ row }"> <el-button type="primary" size="small" @click="editUser(row)">编辑</el-button> <el-button type="danger" size="small" @click="deleteUser(row)">删除</el-button> </template> </el-table-column> </el-table> </div> </template> <script> import { getUserList, deleteUser } from '@/api/user' export default { data() { return { users: [] } }, created() { this.getUserList() }, methods: { async getUserList() { const res = await getUserList() this.users = res.data }, editUser(row) { // 编辑用户 }, async deleteUser(row) { await deleteUser(row.id) this.getUserList() } } } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

5210丫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值