elementui图片上传php,vue+element-ui+富文本————图片上传

最近用vue+element-ui开发一套后台管理系统,其中项目中需要用到富文本编辑器,这里总结下开发过程中遇到的坑和使用方法。

刚开始用的是vue-quill-editor结合element-ui上传图片到服务器,name问题来了 按照官方文档上面的方式。下面是我的代码

class="avatar-uploader"

:action="serverUrl"

name="img"

:headers="header"

:show-file-list="false"

:on-success="uploadSuccess"

:on-error="uploadError"

:before-upload="beforeUpload">

v-model="detailContent"

ref="myQuillEditor"

:options="editorOption"

@change="onEditorChange($event)"

@ready="onEditorReady($event)"

>

export default {

data() {

return {

quillUpdateImg: false, // 根据图片上传状态来确定是否显示loading动画,刚开始是false,不显示

serverUrl: '', // 这里写你要上传的图片服务器地址

header: {token: sessionStorage.token}, // 有的图片服务器要求请求头需要有token之类的参数,写在这里

detailContent: '', // 富文本内容

editorOption: {} // 富文本编辑器配置

}

},

methods: {

// 上传图片前

beforeUpload(res, file) {},

// 上传图片成功

uploadSuccess(res, file) {},

// 上传图片失败

uploadError(res, file) {}

}

}

那么我们需要怎样将富文本图片上传这个按钮跟自定义的文件上传做绑定呢。

bVbk0yO

很简单,我们需要在editorOption配置中这么写

export default {

data() {

return {

quillUpdateImg: false, // 根据图片上传状态来确定是否显示loading动画,刚开始是false,不显示

serverUrl: '', // 这里写你要上传的图片服务器地址

header: {token: sessionStorage.token}, // 有的图片服务器要求请求头需要有token之类的参数,写在这里

detailContent: '', // 富文本内容

editorOption: {

placeholder: '',

theme: 'snow', // or 'bubble'

modules: {

toolbar: {

container: toolbarOptions, // 工具栏

handlers: {

'image': function (value) {

if (value) {

document.querySelector('#quill-upload input').click()

} else {

this.quill.format('image', false);

}

}

}

}

}

}

}

}

}

但是这里问题就出现了,当你用element-ui upload方法上传时你会发现上传不成功,emmmm~你会发现上传时Request Method 方式为OPTIONS,这跟平时的提交方式不一样,Status Code等于204,,去网上又查阅了下,发现这种请求方式,但是最终还是没有解决掉,好像是需要后端也要相应的改下东西

bVbk0Ed

所以走到这里只能用另外一种方式去实现相同的功能了————Ueditor

第一步:先按照官方的提示 去官网下载相应的代码,我这里后端语言是PHP所以我下的是PHP的版本,根据需求去下载

bVbk0FI

bVbk0IA

第二步:ueditor里除了php文件都放到static文件,这是我的目录结构

bVbk0KE

第三步:将PHP文件放到后端去,我这边项目是我直接放到ftp上面去的,结构如下

bVbk0Lw

第四步:我这边封装成了一个公共组件,因为有很多页面需要用到

//import AppConfig from '@/config'

import '../../../static/ueditor/ueditor.config.js'

import '../../../static/ueditor/ueditor.all.js'

import '../../../static/ueditor/lang/zh-cn/zh-cn.js'

export default {

name: "UEditor",

props: {

id: {

type: String

},

config: {

type: Object

},

defaultMsg: {

type: String

},

},

created() {

//this.$emit('defaultMsgVlaue', this.names)

},

data() {

return {

editor: null,

names: ''

}

},

mounted() {

//初始化UE

const _this = this;

this.initEditor()

//this.editor = UE.getEditor(this.id, this.config);

// this.editor.addListener('ready', () => {

// this.editor.setContent(_this.defaultMsg);

// });

},

destoryed() {

this.editor.destory();

},

methods: {

getUEContent: function() {

return this.editor.getContent();

},

initEditor() {

let _this= this;

this.editor = UE.getEditor('editor', this.config)

//编辑器准备就绪后会触发该事件

this.editor.addListener('ready',()=>{

//设置可以编辑

this.editor.setEnabled();

this.editor.setContent(_this.defaultMsg);

})

//编辑器内容修改时

this.selectionchange()

},

//编辑器内容修改时

selectionchange() {

this.editor.addListener('selectionchange', () => {

//this.content = this.ue.getContent()

})

}

},

activated() {

//初始化编辑器

this.initEditor()

}

}

页面调用如下

打开窗口

获取内容

import {UEditor} from './ueditor/index.js'

export default{

name: 'hello',

components: {UEditor},

data(){

return {

config: {

/*//可以在此处定义工具栏的内容

toolbars: [

['fullscreen', 'source','|', 'undo', 'redo','|','bold', 'italic', 'underline', 'fontborder', 'strikethrough',

'|','superscript','subscript','|', 'forecolor', 'backcolor','|', 'removeformat','|', 'insertorderedlist', 'insertunorderedlist',

'|','selectall', 'cleardoc','fontfamily','fontsize','justifyleft','justifyright','justifycenter','justifyjustify','|',

'link','unlink']

],*/

autoHeightEnabled: false,

autoFloatEnabled: true,  //是否工具栏可浮动

initialContent:'请输入内容', //初始化编辑器的内容,也可以通过textarea/script给值,看官网例子

autoClearinitialContent:true, //是否自动清除编辑器初始内容,注意:如果focus属性设置为true,这个也为真,那么编辑器一上来就会触发导致初始化的内容看不到了

initialFrameWidth: null,

initialFrameHeight: 450,

BaseUrl: '',

UEDITOR_HOME_URL: 'static/ueditor/'

},

addFormVisible: false

}

},

methods: {

openWindow: function(){

this.addFormVisible = true;

},

//获取文档内容

getContent: function(){

let content = this.$refs.ueditor.getUEContent();

console.log(content);

alert(content);

}

}

}

注意:在这里封装成一个公共组件了,但是在使用的过程中会发现,在同一页面回显数据到ueditor时只会渲染一次,这可怎么办呢,

这里想到了用watch来监听,然后再将数据放到ueditor里,这里我用的参数名是defaultMsg,代码如下:

watch: {

'defaultMsg': {

handler(newValue, oldValue) {

//父组件param对象改变会触发此函数

this.editor.setContent(newValue);

},

deep: true

}

}

这样的话再同一个页面回显ueditor时就会实时改变,做到这里我想着试下在其他页面是否可以,因为有多个路由页面需要用到ueditor,当我在其他页面打开ueditor时,发现ueditor加载不出来了,然后我就纳闷了,然后排查了很多问题之后,终于知道是因为每次只初始化了ueditor,但是在关闭页面时没有将其销毁,所以需要在上面封装的公共组件里去销毁下

destroyed() {

//销毁编辑器实例,使用textarea代替

this.editor.destroy()

//重置编辑器,可用来做多个tab使用同一个编辑器实例

//如果要使用同一个实例,请注释destroy()方法

// this.ue.reset()

}

这样的话就解决了在多个路由页面的时候ueditor不现实的问题。

第五步:配置文件上传和回显,我们需要在上传图片,并且让上传的图片回显到ueditor里,首先先将文件ueditor/ueditor.config.js里的serverUrl换成自己项目的服务器路径

bVbk0VP

这里配置之后就可以直接使用了

遇到的其他问题如下:前端代码必须跟PHP文件放在同一个域名上,我之前是将两块代码分别放到不同FTP上,这样导致ueditor里文件可以上传但是提示上传失败,这样上传的图片没法回显

有些还是不清楚的,或者有其他更好实现效果的方法的伙伴可以跟我留言,欢迎共同进步

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

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

相关文章

[剑指offer][JAVA][面试第40题][最小的k个数][快选][堆][BST]

【问题描述】面试第40题 最小的k个数 输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。 示例 : 输入:arr [3,2,1], k 2 输出:[1,2] …

java学习(161):同步代码块

public class SynCode implements Runnable{public void run(){synchronized (this){Thread currentThread.currentThread();//获取当前线程for(int i1;i<10;i){System.out.println( "当前执行代码块的名称为" current.getName());try {Thread.sleep( 1000 );}cat…

[如何做研究][如何写论文]

音频 沈向洋&#xff1a;有效的科研法则 科学上网&#xff1a;https://www.youtube.com/watch?vU6r3R87AKHI&featureyoutu.be 视频 文章 【经典重温】MIT人工智能实验室: 如何做研究&#xff1f; 机器学习研究者的养成指南&#xff0c;吴恩达建议这么读论文 周志华 […

java学习(162):同步对象锁

定义一个dog类 public class Dog {private String name;public String getName() {return name;}public void setName(String name) {this.name name;} }定义一个同步对象锁 //同步对象锁 public class SysObject implements Runnable {private Dog dog;public SysObject(){…

[Leedcode][JAVA][第56题][合并区间][数组][贪心算法]

【问题描述】56.合并区间 给出一个区间的集合&#xff0c;请合并所有重叠的区间。 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].【解答思路】 1. 双指针 左边位置一定是确定&#xff0c;…

java读写注册表的两种方式,Preferences与jRegistry

打开注册表方式&#xff1a;电脑上的windows键加r键打开运行程序->输入指令regedit->随即系统便会提示你是否要运行&#xff0c;选择“是“就行了 由于java程序是“write once, run everywhere”&#xff0c;用java读写注册表&#xff0c;那程序的跨平台性就差了。java对…

java学习(163):同步方法锁

public class SynMethon implements Runnable{private double money1000000;public void run(){dbMoney();}//同步方法private synchronized void dbMoney(){Thread tThread.currentThread();for(int i1;i<10;i){if(t.getName().equals( "会计" )){moneyi*10;Sy…

PBFT

摘要&#xff1a; PBFT是Practical Byzantine Fault Tolerance的缩写&#xff0c;即&#xff1a;实用拜占庭容错算法。该算法是Miguel Castro&#xff08;卡斯特罗&#xff09;和Barbara Liskov&#xff08;利斯科夫&#xff09;在1999年提出来的&#xff0c;解决了原始拜占庭…

Python爬虫爬取美剧网站

一直有爱看美剧的习惯&#xff0c;一方面锻炼一下英语听力&#xff0c;一方面打发一下时间。之前是能在视频网站上面在线看的&#xff0c;可是自从广电总局的限制令之后&#xff0c;进口的美剧英剧等貌似就不在像以前一样同步更新了。 但是&#xff0c;作为一个宅diao的我又怎甘…

php 存储html 内容,HTML 本地存储

HTML 本地存储HTML 本地存储&#xff1a;优于 cookies。什么是 HTML 本地存储&#xff1f; ( 推荐学习&#xff1a;html教程 )通过本地存储(Local Storage)&#xff0c;web 应用程序能够在用户浏览器中对数据进行本地的存储。在 HTML5 之前&#xff0c;应用程序数据只能存储在 …

java学习(165):inetaddress和inetsocketaddress

import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException;//inetaddress public class test112 {public static void main(String[] args){try {InetAddress add0 InetAddress.getLocalHost();//获取本机ip地址实例System.out…

java学习(166):socket服务端和客户端连接

socket服务端 import java.io.IOException; import java.net.ServerSocket; import java.net.Socket;//socket服务端 public class test114 {public static void main(String[] args){ServerSocket serverSocketnull;Socket clientnull;/*创建服务器套接字*/try {serverSocket…

[Leedcode][JAVA][第11题][盛最多水的容器][双指针][贪心]

【问题描述】11.盛最多水的容器 给你 n 个非负整数 a1&#xff0c;a2&#xff0c;...&#xff0c;an&#xff0c;每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线&#xff0c;垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线&#xff0c;使得它们与…

SAP S/4HANA使用ABAP获得生产订单的状态

在S/4HANA里&#xff0c;我们如何根据一个销售订单的行项目&#xff0c;查看对应的生产订单状态&#xff1f; 双击行项目&#xff1a; 点击Schedule line&#xff1a; 这里就能看到生产订单的ID和状态了。 其中订单的状态存储在表vsaufk里&#xff0c;注意订单和状态可以是1对多…

http:(1):http简介

HTTP 简介 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。。 HTTP是一个基于TCP/IP通信协议来传递数据&#xff08;HTML 文件, …

[Leedcode][JAVA][第466题][统计重复个数][数组]

【问题描述】466. 统计重复个数 由 n 个连接的字符串 s 组成字符串 S&#xff0c;记作 S [s,n]。例如&#xff0c;["abc",3]“abcabcabc”。如果我们可以从 s2 中删除某些字符使其变为 s1&#xff0c;则称字符串 s1 可以从字符串 s2 获得。例如&#xff0c;根据定义…

phantomJs原理

引用文段&#xff1a;链接&#xff1a;https://www.jianshu.com/p/0254391918f7 网页渲染可分为服务端渲染和客户端渲染&#xff0c;前者是指你在浏览器地址栏输入一个网址&#xff0c;Web服务器处理请求过程就将所有需要呈现的html元素都构造好了&#xff0c;浏览器收到响应就…

oracle t44,SecureFiles LOBs基础知识之存储篇

SecureFiles LOBs相比于BasicFilesLOBs具有加密(encryption)、去重(deduplicaiton)、压缩(compression)等新功能&#xff0c;pctversion&#xff0c;chunksize等参数也仅仅为了向后兼容而保留&#xff0c;因此SecureFiles LOBs的自适应能力更强&#xff0c;在管理上更为简化&am…

[Leedcode][JAVA][第200题][岛屿数量][DFS][BFS][并查集]

【问题描述】 第200题 岛屿数量 给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外&#xf…

python闯关_Day012

day012 用python实现信息卡管理及购物商城的项目 需求 #需求: 1 这是一个信用卡管理程序 2 用户手持信用卡购物&#xff0c;使用函数&#xff0c;按照软件开发规范 3 用户名密码存放于文件中&#xff0c;支持多用户登陆&#xff0c;使用json 4 程序启动&#xff0c;先登录或者…