富文本编辑器图片上传并回显

1.概述

在代码业务需求中,我们会经常涉及到文件上传的功能,通常来说,我们存储文件是不能直接存储到数
据库中的,而是以文件路径存储到数据库中;但是存储文件的路径到数据库中又会有一定的问题,就是
浏览器是不能直接访问我们的本机的文件资源的;即便我们通过别的技术手段可以让浏览器访问本地资
源,那也是不安全的,基本上不会使用这样的手段;我们一般是把资源上传到服务器中。

2.使用步骤(纯前端上传版)

这里使用的富文本编辑器是 wangEditor ,且这里使用的是华为云的云存储技术 OBS ;本项目不打算做后
端连接,只是演示如何使用文件上传功能,想使用后端连接的小伙伴可以直接创建一个后端项目,只需
创建一个接口和一个接口参数便即可接收到前端的富文本编辑器的内容。

2.1 创建vue项目

vue 项目同学们基本上都会创建了,这里就不做过多的赘述

2.2创建一个页面,开始编辑页面

查看官方文档: 快速开始 | wangEditor
安装 npm install @wangeditor/editor --save npm install @wangeditor/editor
for-vue@next --save
复制粘贴 Demo 的代码即可完成富文本编辑器的编辑
在本项目中,我比较喜欢 vue3 的组合式语法,所以和官网的代码略有不同
<template>
<h2 style = "margin-left: 10vw" > 这是富文本编辑器 1 </h2>
<div class = "editView1" >
<div style = "height: 90%;border: 1px solid #ccc" >
<Toolbar
style = "border-bottom: 1px solid #ccc"
:editor = "editorRef"
:defaultConfig = "toolbarConfig"
:mode = "mode"
/>
<Editor
style = "height: 90%; overflow-y: hidden;"
v-model = "valueHtml"
:defaultConfig = "editorConfig"
:mode = "mode"
@onCreated = "handleCreated"
/>
</div>
<el-button> 点击提交 </el-button>
</div>
<h3 style = "margin-left: 10vw" > 这是提交到数据的文本内容 </h3>
<div style = "margin-top: 10px;width: 80vw;margin-left: 10vw;border: 1px solid" >
<p> {{valueHtml}} </p>
</div>
</template>
<script setup >
import '@wangeditor/editor/dist/css/style.css' ;
import { onBeforeUnmount , ref , shallowRef , onMounted } from 'vue' ;
import { Editor , Toolbar ,} from '@wangeditor/editor-for-vue' ;
// 编辑器实例,必须用 shallowRef
const editorRef = shallowRef ()
// 内容 HTML
const valueHtml = ref ( '<p>hello</p>' )
const toolbarConfig = {}
const editorConfig = {
placeholder : ' 请输入内容 ...' ,
}
// 组件销毁时,也及时销毁编辑器,也是一直进行触发
onBeforeUnmount (() => {
const editor = editorRef . value
if ( editor == null ) return
editor . destroy ()
})
const handleCreated = ( editor ) => {
editorRef . value = editor // 记录 editor 实例,重要!
}
</script>
<style scoped >
.editView1 {
width : 80vw ;
height : 50vh ;
margin-left : 10vw ;
}
</style>

2.3编辑图片上传功能

上面代码是没有文件上传的功能的,这个功能是需要我们自己添加的

先去官方文档找到菜单编辑部分: 菜单配置 | wangEditor
看到我圈的地方,将该代码添加到对应的地方
const editorConfig = {
placeholder: ' 请输入内容 ...',
MENU_CONF: {}
}

 在跳转到官方文档找到上传图片部分:菜单配置 | wangEditor

script代码块中,继续向后添加内容,里面就可以写上我们的上传图片的的相关代码

editorConfig.MENU_CONF['uploadImage'] = {
// 上传图片的配置
}
但不过我的项目中使用的是华为云存储技术,和同学们的可能有点出入,所以以下代码仅供参考,不能
直接复制粘贴使用
// 创建云存储的实例对象
var obsClient = new ObsClient({
access_key_id: " 填写 ak 密钥 ",
secret_access_key: " 填写 sk 密钥 ",
// 这里以我自己的访问路径为例,其他的话请按实际情况填写
server: 'https://obs.cn-north-4.myhuaweicloud.com'
});
// 自定义图片上传
editorConfig.MENU_CONF['uploadImage'] = {
async customUpload(file, insertFn) { // JS 语法
// file 即选中的文件 , 先上传对象文件
obsClient.putObject({
Bucket: 'beixuan',
Key: file.name,
SourceFile: file
}, function (err, result) {

if(err){

// 上传失败
console.error('Error-->' + err);
}else{
// 最后回显图片
// 自己实现上传,并得到图片 url alt href
var url = "https://beixuan.obs.cn-north-4.myhuaweicloud.com/"+file.name
var alt = file.name
var href = "https://beixuan.obs.cn-north-
4.myhuaweicloud.com/"+file.name
insertFn(url,alt,href)
}
});
}
}

 3.使用步骤(后端上传版)

3.1 界面创建还是上面的步骤只不过自定义上传的方法不同

// 自定义图片上传
editorConfig.MENU_CONF['uploadImage'] = {
// 自定义上传
async customUpload(file, insertFn) { // JS 语法
const formData = new FormData();
formData.append('image', file);
try {
const response = await axios.post('/UploadToWeb/upload/image', formData);
console.log(response)
if (response.errno == 0){
console.log(response.data)
insertFn(response.data.url, response.data.alt, response.data.href)
}
} catch (error) {
console.error('Error uploading file:', error);
}
// file 即选中的文件
// 自己实现上传,并得到图片 url alt href
// 最后插入图片
}

 3.2 创建后端程序(无数据库连接)

@RestController
@RequestMapping("/upload")
public class UploadController {
@RequestMapping("/image")
public ResultJSON uploadImage(@RequestParam("image") MultipartFile file){
//直接在代码中指定路径(不推荐,因为硬编码的路径不灵活)
String uploadDir = System.getProperty("catalina.base") + File.separator +
"webapps" + File.separator + "UploadToWeb" + File.separator + "image";
try {
// 确保上传目录存在
File uploadDirectory = new File(uploadDir);
if (!uploadDirectory.exists()) {
uploadDirectory.mkdirs();
}
// 构建目标文件路径
String fileName = file.getOriginalFilename();
// 这里你可以添加逻辑来避免文件名冲突或路径遍历攻击
File destFile = new File(uploadDirectory, fileName);
// 保存文件
file.transferTo(destFile);
ResData data = new ResData();
data.setUrl("http://192.168.78.132:8080/UploadToWeb/image/"+destFile.getName());
data.setAlt(fileName);
data.setUrl("http://192.168.78.132:8080/UploadToWeb/image/"+destFile.getName());
return ResultJSON.ok(data);
} catch (IOException e) {
e.printStackTrace();
return ResultJSON.err("系统错误,上传失败");
}
}
}

3.3 跨域解决

export default defineConfig({
plugins: [vue(),],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
}
},
//前端代理进行跨域决解问题
server:{
proxy:{
'/api':{ //将路径中含有api的路径就会进来到这里
changeOrigin:true, //是否切换源
target:"http://192.168.78.132:8080/", //确定切换源后需要切换成哪一
个源
rewrite:(path) => path.replace(/^\/api/,'') //是否重写路径,重写成什么路径
//上面表示说重写路径时,由于后端的接口中除了没有/api这个部分外,其他的的一样,所以
把'/api'替换成空字符串就是一样的了
}
}

 3.4 打包成war包及部署到tomcat服务器上

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

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

相关文章

JVM指令集概览:基础与应用

写在文章开头 在现代软件开发中,Java 语言凭借其“一次编写,到处运行”的理念成为了企业级应用的首选之一。这一理念的背后支撑技术正是 Java 虚拟机(JVM)。JVM 是一个抽象的计算机,它实现了 Java 编程语言的各种特性,并且能够执行编译后的字节码文件。了解 JVM 的工作原…

麒麟系统x86安装达梦数据库

一、安装准备前工作 操作系统&#xff1a;银河麒麟V10&#xff0c;CPU&#xff1a; x86_64 架构 下载地址&#xff0c;麒麟官网&#xff1a;https://www.kylinos.cn/ 数据库&#xff1a;dm8_20220915_x86_kylin10_64 下载地址&#xff0c;达梦数据库官网&#xff1a;https://…

力扣 二叉树的中序遍历

用了递归遍历&#xff0c;关于树的经典例题。 题目 递归 常规做法即递归了&#xff0c;不会写也得背下来。递归可以大致理解方法调用自身&#xff0c;先写中序遍历递归的方法&#xff0c;递归一定要有递归出口&#xff0c;当遍历到节点为空时返回&#xff0c;即已经找到了。…

windows server 2019 启动 nginx 报错

环境 &#xff1a;windows server 2019 &#xff0c;nginx-1.19.7 背景&#xff1a; 自己经常用这个 nginx 包作为 web 服务器。今天发现 部署到 server 2019 上直接报错了。这可是原生的包&#xff0c;我啥也没改&#xff0c;怎么可能报错。而且之前在 其他服务器用都没问题…

python代码示例(读取excel文件,自动播放音频)

目录 python 操作excel 表结构 安装第三方库 代码 自动播放音频 介绍 安装第三方库 代码 python 操作excel 表结构 求出100班同学的平均分 安装第三方库 因为这里的表结构是.xlsx文件,需要使用openpyxl库 如果是.xls格式文件,需要使用xlrd库 pip install openpyxl /…

百度智能云发布首个空间智能解决方案,百度AI优势如何分析?

首先&#xff0c;百度智能云此次推出的空间智能解决方案&#xff0c;在技术底座上展现了其强大的AI异构计算能力。百度百舸AI异构计算平台作为该方案的底层支撑&#xff0c;为2D和3D应用中的人物、物件及场景生成提供了强大的算力支持。这一平台的推出&#xff0c;不仅提升了空…

深度学习-49-AI应用实战之基于HyperLPR的车牌识别

文章目录 1 车牌识别系统1.1 识别原理1.1.1 车牌定位1.1.2 字符识别2 实例应用2.1 安装hyperlpr32.2 识别结果2.3 可视化显示2.4 结合streamlit3 附录3.1 PIL.Image转换成OpenCV格式3.2 OpenCV转换成PIL.Image格式3.3 st.image嵌入图像内容3.4 参考附录1 车牌识别系统 车牌识别…

非递归遍历二叉树(数据结构)

我的博客主页 非递归遍历二叉树 前序遍历&#xff08;迭代&#xff09;中序遍历&#xff08;迭代&#xff09;后续遍历&#xff08;迭代&#xff09; 二叉树的遍历方式有&#xff1a;前序遍历、中序遍历、后续遍历&#xff0c;层序遍历&#xff0c;而树的大部分情况下都是通过递…

丹摩征文活动|实现Llama3.1大模型的本地部署

文章目录 1.前言2.丹摩的配置3.Llama3.1的本地配置4. 最终界面 丹摩 1.前言 Llama3.1是Meta 公司发布的最新开源大型语言模型&#xff0c;相较于之前的版本&#xff0c;它在规模和功能上实现了显著提升&#xff0c;尤其是最大的 4050亿参数版本&#xff0c;成为开源社区中非常…

基于stm32单片机的教室节能系统设计

功能描述 0. STM32F103C8T6单片机为控制核心 1. OLED液晶显示当前年 月 日 时 分 秒 星期 2. 按键可以设置定时时间 3. 按键可以设置用电开关的开启和关闭时间&#xff0c;实现设备的节能 4. 通过红外遥控可以打开关闭空调设备&#xff08;通过继电器开关闭合模拟&#x…

防止按钮被频繁点击

在做开发的时候,不希望按钮被用户频繁点击,给后端服务器增加负担,这个时候,可以在按钮的触发函数加上如下代码: // 禁用按钮 const fetchButton document.querySelector(.btn-fetch); fetchButton.disabled true; // 延时61秒后重新启用按钮 setTimeout(() > { fetchBut…

Spring Boot【三】

自动注入 xml中可以在bean元素中通过autowire属性来设置自动注入的方式&#xff1a; <bean id"" class"" autowire"byType|byName|constructor|default" /> byName&#xff1a;按照名称进行注入 byType&#xff1a;按类型进行注入 constr…

构建 LLM (大型语言模型)应用程序——从入门到精通(第七部分:开源 RAG)

通过检索增强生成 (RAG) 应用程序的视角学习大型语言模型 (LLM)。 本系列博文 简介数据准备句子转换器矢量数据库搜索与检索大语言模型开源 RAG&#xff08;本帖&#xff09;评估服务LLM高级 RAG 1. 简介 我们之前的博客文章广泛探讨了大型语言模型 (LLM)&#xff0c;涵盖了其…

【Python入门】Python数据类型

文章一览 前言一、变量1.1.如何使用变量1.2.如何定义变量的名字&#xff08;标识符&#xff09; 二、数据类型2.1 整型数据2.2 浮点型数据2.3 布尔型&#xff08;bool&#xff09;数据2.4 复数型数据2.5 字符串类型1 > 字符串相加&#xff08;合并&#xff09;&#xff08;&…

第1章-JVM和Java体系架构

虚拟机 虚拟机概念 所谓虚拟机&#xff08;Virtual Machine&#xff09;&#xff0c;就是一台虚拟的计算机。它是一款软件&#xff0c;用来执行一系列虚拟计算机指令。大体上&#xff0c;虚拟机可以分为系统虚拟机和程序虚拟机。 大名鼎鼎的Virtual Box&#xff0c;VMware就属…

【H2O2|全栈】Node.js(2)

目录 前言 开篇语 准备工作 npm 概念 常见指令 项目中的包 创建项目 启动项目 服务器搭建 express 基本步骤 搭建应用 创建路由 监听端口 启动服务器 面试相关 结束语 前言 开篇语 本系列博客分享Node.js的相关知识点&#xff0c;本章讲解npm与服务器的简单…

JDK的版本演化,JDK要收费吗?

Java版本演化历史 Java的版本历史可以追溯到1995年&#xff0c;以下是Java语言自诞生以来的主要版本及其关键特性&#xff1a; 一、早期版本 Java 1.0&#xff08;1996年1月发布&#xff09; 引入了Java虚拟机&#xff08;JVM&#xff09;和Java应用编程接口&#xff08;API&…

书生大模型实训营第4期进阶岛第三关:LMDeploy 量化部署进阶实践

书生大模型实训营第4期进阶岛第三关&#xff1a;LMDeploy 量化部署进阶实践 1. 配置 LMDeploy 环境1.1 开发机的创建与环境搭建1.2 模型获取1.3 模型测试 2. InternLM2.5 的部署与量化2.1 LMDeploy API 部署 InternLM2.52.1.1 启动API服务器2.1.2 以命令行形式连接 API 服务器2…

visionpro官方示例分析(一) 模板匹配工具 缺陷检测工具

1.需求&#xff1a;找出图像中的这个图形。 2.步骤 使用CogPMAlignTool工具&#xff0c;该工具是模板匹配工具&#xff0c;见名知意&#xff0c;所谓模板匹配工具就是说先使用该工具对一张图像建立模板&#xff0c;然后用这个模板在其他图像上进行匹配&#xff0c;匹配上了就说…

Z2400027基于Java+SpringBoot+Mysql+thymeleaf引擎的图书馆管理系统的设计与实现 代码 论文

图书馆管理系统的设计与实现 一、项目背景与简介二、系统总体功能三、运行环境与技术选型四、系统架构与模块划分五、系统界面截图六、源码获取 一、项目背景与简介 项目背景&#xff1a; 随着信息技术的不断发展和图书资源的日益丰富&#xff0c;图书馆作为知识传播和学习的重…