百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

vue实战024:Vue-Quill-Editor自定义图片上传详解

ztj100 2024-10-27 18:36 21 浏览 0 评论

vue-quill-editor是个较为轻量级富文本,但是在使用vue-quill-editor我们会发现,vue-quill-editor默认插入图片是直接将图片转为base64再放入内容中,如果图片比较大的话,富文本的内容就会很大,而且也不方便我们处理。所以这里需要来重新定义图片上传功能,当我们选择图片后将图片上传服务器,服务器返回相应的图片链接,前端将图片链接插入到富文本的指定光标上位置,在提交富文本的内容的时候图片只是以图片地址提交。

样式重写

我们重新写个简单的样式,用来上传图片是使用,默认隐藏(uploadimg=false),当我们点击上传图片图标时将其显示,所以这里我们要做的就是新增HTML和CSS并且重写toolbar中image的方法。

事件重定义

下面要做的就是重新定义image方法,在toolbar中的headers中 我们可以给对应的标签重新定义方法,这里我们要该的是image,当我们点击时显示我们新增的样式,也就是把uploadimg=false改成uploadimg=true,所以我们直接在headers中禁用quill内部上传图片,然后写个点击事件触发新事件。

#data
toolbar:{
 container: toolbarOptions,
 handlers: {
 'image': function () {
 this.quill.format('image', false); //禁用quill内部上传图片
 }
 }
 }
#computed
quill(){
 let quill=this.$refs.BGEditor.quill
 return quill
}
# mounted
img:{
 var imgup=document.querySelector('.quill-editor .ql-image')
 imgup.onclick= () =>{
 this.uploadimg=!this.uploadimg
 }
}

思路:我们需要做的是点击“上传到服务器”按钮将我们选择的文件发送到后台,后台拿到我们的文件后进行存储并返回我们前端文件路径,前端拿到文件的存储路径,再把路径赋给光标所在的img标签中这样就可以在文中中看到我们上传的图片了。

前台文件发送

首先要获取到上传的文件,这里我们用的是input标签,属性为file,所以这里我们没法用v-model来获取数据,这时我们需要用到$refs来定位获取,我们给input一个ref属性,然后通过let filename=this.$refs.imgfile.files[0]获取到文件对象。

注意事项:我们从前端发送文件给后端时是个文件,所以我们需要创建一个FormData对象来处理文件。

# HTML
<div class="uploadImg" v-show="uploadimg" >
 <p>图像属性</p>
 <input type="file" ref="imgfile">
 <span>支持.jpg .gif .png .bmp.jpeg,大小不超过5M</span></br>
 <button @click="upload">上传到服务器</button>
</div> 
 
# models
upload(){
 let filename=this.$refs.imgfile.files[0]
 var formData = new FormData()
 formData.append("img",filename)
 this.$axios.post('http://127.0.0.1:8000/upload/',formData)
 .then(response =>{
 console.log(response.data)
 })
},

后台接受文件并处理

model创建

我们需要创建一个文件的模型,这里用来存储文件的路径,并指定文件存储位置,我定义了一个简单的模型,只有文件名和文件路径,通过参数upload_to指定上传文件的保存目录,具体的操作可以参考:Django实战009:文件上传实现过程详解

class File(models.Model):
 name = models.CharField(max_length=100)
 file = models.ImageField(upload_to='image', null=True)
 
 def __str__(self):
 return self.name
 
 class Meta:
 db_table = 'file'

路由创建

我们需要给前台一个指定的路由来找到视图,我将upload指向了views.uploadfile,也就是uploadfile方法。

from django.conf.urls import url
from user import views
 
urlpatterns = [
 # url(r'^login/
,views.login), # url(r'^register/
,views.register), url(r'^upload/
,views.uploadfile), ]

视图创建

现在我们需要一个视图(uploadfile)来接受前台发送的数据,通过 request.FILES.get('img')来获取文件对象,拿到文件名然后去数据库中查找该对象是否存在,如果存在我们直接返回该对象的路径,如果没有我们就新增并返回文件路径,这里我返回了一个code表示处理成功,返回一个url则是图片的文件路径。

def uploadfile(request):
 if request.method == "POST":
 fileName = request.FILES.get('img')
 imgname=fileName.name
 if not fileName:
 return HttpResponse('400')
 imgobj=models.File.objects.filter(name=imgname)
 if not imgobj:
 models.File.objects.update_or_create(name=imgname,file=fileName)
 imgurl = imgobj.first().file.url
 else:
 imgurl=imgobj.first().file.url
 info = {'code': '200', 'url': imgurl}
 return JsonResponse(info)
注意事项:这里我们用的是filter而不是get,get是获取唯一值,当没有时就会报错,如果要用就用突然try包裹起来使用,用filter则是使用了查询集,没有则返回空。

前台接受返回数据

首先我们先接受后台返回到的数据,通过code来判断数据是否处理成,如果失败则弹出“图片插入失败”提示,如果成功我们就将图片插入到光标所在位置即可。

upload(){
 let filename=this.$refs.imgfile.files[0]
 var formData = new FormData()
 formData.append("img",filename)
 console.log(FormData)
 this.$axios.post('http://127.0.0.1:8000/upload/',formData)
 .then(response =>{
 console.log(response.data)
 let quill=this.$refs.BGEditor.quill
 if(response.data['code']==200){
 //获取图片路径
 let imgurl='http://127.0.0.1:8000'+response.data['url']
 // 获取光标所在位置
 let position = quill.getSelection().index
 quill.insertEmbed(position, 'image', imgurl)
 quill.setSelection(position + 1)
 this.uploadimg=false
 }else {
 // 提示信息,需引入Message
 Message.error('图片插入失败')
 }
 }
 )
},

相关推荐

如何将数据仓库迁移到阿里云 AnalyticDB for PostgreSQL

阿里云AnalyticDBforPostgreSQL(以下简称ADBPG,即原HybridDBforPostgreSQL)为基于PostgreSQL内核的MPP架构的实时数据仓库服务,可以...

Python数据分析:探索性分析

写在前面如果你忘记了前面的文章,可以看看加深印象:Python数据处理...

CSP-J/S冲奖第21天:插入排序

...

C++基础语法梳理:算法丨十大排序算法(二)

本期是C++基础语法分享的第十六节,今天给大家来梳理一下十大排序算法后五个!归并排序...

C 语言的标准库有哪些

C语言的标准库并不是一个单一的实体,而是由一系列头文件(headerfiles)组成的集合。每个头文件声明了一组相关的函数、宏、类型和常量。程序员通过在代码中使用#include<...

[深度学习] ncnn安装和调用基础教程

1介绍ncnn是腾讯开发的一个为手机端极致优化的高性能神经网络前向计算框架,无第三方依赖,跨平台,但是通常都需要protobuf和opencv。ncnn目前已在腾讯多款应用中使用,如QQ,Qzon...

用rust实现经典的冒泡排序和快速排序

1.假设待排序数组如下letmutarr=[5,3,8,4,2,7,1];...

ncnn+PPYOLOv2首次结合!全网最详细代码解读来了

编辑:好困LRS【新智元导读】今天给大家安利一个宝藏仓库miemiedetection,该仓库集合了PPYOLO、PPYOLOv2、PPYOLOE三个算法pytorch实现三合一,其中的PPYOL...

C++特性使用建议

1.引用参数使用引用替代指针且所有不变的引用参数必须加上const。在C语言中,如果函数需要修改变量的值,参数必须为指针,如...

Qt4/5升级到Qt6吐血经验总结V202308

00:直观总结增加了很多轮子,同时原有模块拆分的也更细致,估计为了方便拓展个管理。把一些过度封装的东西移除了(比如同样的功能有多个函数),保证了只有一个函数执行该功能。把一些Qt5中兼容Qt4的方法废...

到底什么是C++11新特性,请看下文

C++11是一个比较大的更新,引入了很多新特性,以下是对这些特性的详细解释,帮助您快速理解C++11的内容1.自动类型推导(auto和decltype)...

掌握C++11这些特性,代码简洁性、安全性和性能轻松跃升!

C++11(又称C++0x)是C++编程语言的一次重大更新,引入了许多新特性,显著提升了代码简洁性、安全性和性能。以下是主要特性的分类介绍及示例:一、核心语言特性1.自动类型推导(auto)编译器自...

经典算法——凸包算法

凸包算法(ConvexHull)一、概念与问题描述凸包是指在平面上给定一组点,找到包含这些点的最小面积或最小周长的凸多边形。这个多边形没有任何内凹部分,即从一个多边形内的任意一点画一条线到多边形边界...

一起学习c++11——c++11中的新增的容器

c++11新增的容器1:array当时的初衷是希望提供一个在栈上分配的,定长数组,而且可以使用stl中的模板算法。array的用法如下:#include<string>#includ...

C++ 编程中的一些最佳实践

1.遵循代码简洁原则尽量避免冗余代码,通过模块化设计、清晰的命名和良好的结构,让代码更易于阅读和维护...

取消回复欢迎 发表评论: