1.上传图片至自己的服务器(这个官方都有例子,重点介绍附件上传)
图片上传官方网址

// onChange callback
$('#summernote').summernote({
callbacks: {
onChange: function(contents, $editable) {
console.log('onChange:', contents, $editable);
}
}
}); // summernote.change
$('#summernote').on('summernote.change', function(we, contents, $editable) {
console.log('summernote\'s content is changed.');
})

summernote是一款富文本编辑器,但是他上传的图片的时候,图片会以二进制的形式存入数据库字段中,这时候就很占资源,所以我们希望图片能存入自己的服务器,在字段中就以链接地址的形式存放,这时候就需要在上传图片的时候进行处理,所以callbacks下面的onImageUpload进行图片文件的处理。
示例

//初始化定义
var _this=this;
this.curEle=$('#'+this.id);
var fileUploadBtn=this.template;
this.curEle.summernote({
focus: true,
lang:'zh-CN', //中文说明配置
placeholder:'请输入内容',
fontNames: ['宋体','微软雅黑','楷体','黑体','隶书', 'Arial', 'Arial Black', 'Comic Sans MS', 'Courier New',
'Helvetica Neue', 'Helvetica', 'Impact', 'Lucida Grande',
'Tahoma', 'Times New Roman', 'Verdana'],
height:400,
minHeight:300,
maxHeight:null,
toolbar: [
['style', ['style']],
['font', ['bold', 'italic', 'underline', 'clear']],
['fontname', ['fontname']],
['color', ['color']],
['para', ['ul', 'ol', 'paragraph','height']],
['table', ['table']],
['insert', ['fileBtn','media', 'link', 'picture', 'video']],
['view', ['fullscreen']]
],
buttons: {
fileBtn: fileUploadBtn
},
callbacks: {
onImageUpload: function (files,editor, $editable) {
_this.sendFile(files[0]);
}, }
})
methods:{
sendFile(files){
var _this=this;
var data = new FormData();
data.append("file", files);
$.ajax({
data : data,
type : "POST",
url : SERVICE_URLS.commonUrl.uploadPic.path, //此处为图片上传服务器请求地址,返回的是图片上传后的路径(例如:请求接口为http://120.96.35.20:8090/uploadPic)
cache : false,
contentType : false,
processData : false,
dataType : "json",
success: function(data) {//举例data:{data:'http://www.test.com/a.jpg'}
_this.curEle.summernote('insertImage', data.data);
},
error:function(){
alert("上传失败");
}
});
},
template(context){ //此处为自定义附件上传按钮,如果只考虑图片上传请忽略
let _this=this;
var ui = $.summernote.ui;
// create button
var button = ui.button({
contents: '<i /> 附件',
tooltip: '文件上传',
click: function () {
_this.visibleUpload=true; //控制上传文件界面框可见性
setTimeout(function(){
_this.initUploader(); //初始化web uploader插件
},0) }
});
return button.render(); // return button as jquery object
}
}

2.自定义创建附件按钮,上传至自己服务器。

首先介绍github上已经存在的附件插件
uploadcare-summernotegithub链接地址

这是Summernote WYSIWYG编辑器的Uploadcare插件。它允许您的用户从本地设备,社交网络,云存储上传文件和图像,而无需处理上传所需的任何后端代码。这句话意味着你上传的文件存储的位置不在你自己的服务器上。
当然插件提供了定制存储,有兴趣的可以自己尝试。综合考虑插件的方法有点繁琐不安全,不如自己写个附件上传按钮。

示例如下
(1)创建自己的附件上传按钮 自定义按钮, 如上template函数所示:


(2)上传附件,此处用百度的web uploader插件,具体代码不在细讲(可看web uploader API)
(3)根据返回的数据,动态创建DOM插入到summerNote编辑器中。
这里重点说一下思路:
1.利用插件将本地文件上传到我们的服务器
2.当上传完成后(uploadFinished),我们可根据成功返回的数据,动态的创建DOM对象。
3.将创建好的DOM对象,再插入到编辑器中
(注意:这里不用insertNode方法,因为他会额外的<p><br></p>标签--具体查看issue,另外当选取本地文件的时候,此时的富文本编辑器会失去焦点,插入新的node节点的时候,总是从起始点开始插入,而非从当前光标的位置进行插入。所以尝试换种方法,利用设置code重新置换整个编辑框的内容。)

 initUploader(){
var _this=this;
var $list=$('#uploadList');
var state='pending';
var $btn=$('#toServerBtn');
var uploader = WebUploader.create({
swf: 'https://cdn.bootcss.com/webuploader/0.1.1/Uploader.swf',
server: SERVICE_URLS.commonUrl.uploadFile.path, //自己服务器的文件上传接口
pick: '#fileUpload',
resize: false,
fileNumLimit: 10,
fileSizeLimit: 10 * 1024 * 1024,
});
this.uploader=uploader;
// 当有文件被添加进队列的时候
uploader.on( 'fileQueued', function( file ) {
$list.append( '<li id="' + file.id + '" class="fileItem">' +
'<p class="uploadInfo ellipsis">' + file.name + '</p>' +
'<div class="stateBox">' +
'<p class="uploadState">等待上传</p>' +
'<p class="cancelFile" attr="' + file.id + '" >取消上传</p>' +
'</div>'+
'<div class="progress">' +
'<div class="progress-bar"></div>' +
'</div>'+
'</li>' );
if(file){
_this.ifFileQueue=true;
}
});
$list.on('click','.stateBox .cancelFile',function(event){
var target=event.target.getAttribute('attr');
uploader.removeFile( target,true );
$('#'+target).remove();
var status=uploader.getStats();
if(status.queueNum==0){
_this.ifFileQueue=false
}else{
_this.ifFileQueue=true;
}
})
uploader.on( 'uploadProgress', function( file, percentage ) {
var $li = $( '#'+file.id ),
$percent = $li.find('.progress .progress-bar');
// 避免重复创建
if ( !$percent.length ) {
$percent = $('<div class="progress progress-striped active">' +
'<div class="progress-bar" role="progressbar" style="width: 0%">' +
'</div>' +
'</div>').appendTo( $li ).find('.progress-bar');
}
$li.find('p.uploadState').text('上传中');
$percent.css( 'width', percentage * 100 + '%' );
});
uploader.on( 'uploadSuccess', function( file,response ) {
$( '#'+file.id ).find('p.uploadState').text('已上传');
_this.$set( _this.fileList,_this.fileList.length,response.result[0])
});
uploader.on( 'uploadError', function( file ) {
$( '#'+file.id ).find('p.uploadState').text('上传出错');
});
uploader.on( 'uploadComplete', function( file ) {
$( '#'+file.id ).find('.progress').fadeOut();
});
uploader.on('uploadFinished',function(){ //重点在这里
var str=``;
for (var i = 0; i < _this.fileList.length; i++) {
var item = _this.fileList[i];
str+=`<p><a href="${item.fileUrl}" download="${item.fileName}">${item.fileName}</a></p>`;
}
var storageCode=_this.curEle.summernote('code');
_this.curEle.summernote('reset');
var node=$("<div>"+storageCode+str+"</div>")[0];
// _this.curEle.summernote('insertNode',node); //此处不用insertNode
_this.curEle.summernote('code',node);
setTimeout(()=>{
_this.visibleUpload=false;
},1000)
});
uploader.on( 'all', function( type ) {
if ( type === 'startUpload' ) {
state = 'uploading';
} else if ( type === 'stopUpload' ) {
state = 'paused';
} else if ( type === 'uploadFinished' ) {
state = 'done';
}
if ( state === 'uploading' ) {
$btn.text('暂停上传');
} else {
$btn.text('开始上传');
}
});
$btn.on( 'click', function() {
if ( state === 'uploading' ) {
uploader.stop();
} else {
uploader.upload();
}
});
},

代码没有写全,只是提供思路。

summernote(富文本编辑器)将附件与图片上传到自己的服务器(vue项目)的更多相关文章

  1. vue项目富文本编辑器vue-quill-editor之自定义图片上传

    使用富文本编辑器的第一步肯定是先安装依赖 npm i vue-quill-editor 1.如果按照官网富文本编辑器中的图片上传是将图片转为base64格式的,如果需要上传图片到自己的服务器,需要修改 ...

  2. 使用百度UMeditor富文本编辑器,修改自定义图片上传,修改源码

    富文本编辑器,不多说了,这个大家应该都用到过,至于用到的什么版本,那就分很多种 CKEditor:很早以前叫FCK,那个时候也用过,现在改名了,比较流行的一个插件,国外很多公司在用 UEDITOR:百 ...

  3. wangEditor - 轻量级web富文本编辑器(可带图片上传)

    业务需求: 通过后台编辑文章和图片,上传到前端界面,展示新闻消息模块.这个时候,需要一款简洁的编辑器,百度编辑器是最常用的一种,但是功能太过于复杂,而wangEditor - 轻量级web富文本编辑器 ...

  4. ckeditor富文本编辑器的使用和图片上传,复制粘贴图片上传

    自动导入Word图片,或者粘贴Word内容时自动上传所有的图片,并且最终保留Word样式,这应该是Web编辑器里面最基本的一个需求功能了.一般情况下我们将Word内容粘贴到Web编辑器(富文本编辑器) ...

  5. 百度开源富文本编辑器 UEditor配置:图片上传和文件上传独立使用方法

    使用UEditor编辑器自带的插件实现图片上传和文件上传功能,这里通过配置UEditor单独使用其内置的第三方插件swfupload来实现图片和文件的上传,通过对UEditor配置轻松实现图片批量上传 ...

  6. PHP ckeditor富文本编辑器 结合ckfinder实现图片上传功能

    一:前端页面代码 <script src="/www/res/ckeditor/ckeditor.js"></script> <textarea id ...

  7. vue-quill-editor富文本编辑器,上传图片自定义为借口上传

    vue-quill-editor富文本编辑器,上传图片自定义为借口上传 博客地址:https://blog.csdn.net/lyj2018gyq/article/details/82585194

  8. drupal中安装CKEditor文本编辑器,并配置图片上传功能

    一.下载: 1.CKEditor模块 2.IMCE模块 二.安装       1.复制: 下载完上面两个模块之后,解压,将解压后整个文件夹,复制粘贴,放到 sites\all\modules下面,个人 ...

  9. 使用KindEditor富文本编辑器,点击批量上传按钮没有选择图片按钮

    问题:批量上传没有选择图片按钮

随机推荐

  1. RabbitMQ 示例-生产者-消费者-direct-topic-fanout

    这是生产者和消费者2个项目, 包含 direct,topic,fanout模式下的消费,springboot + rabbitmq 代码地址:https://github.com/duende99/R ...

  2. js注册实现

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. C# 如何判断指定文件是否正被其它程序使用

    C# 如何判断指定文件是否正被其它程序使用 起因:项目中发现在操作文件时,系统经常抛出异常,表示文件正被其它程序占用. 需求:为了事先判断,以确认指定的文件是否正被其它程序使用,需要方法进行判断. 思 ...

  4. python读写txt文件

    整理平常经常用到的文件对象方法: f.readline()   逐行读取数据方法一: >>> f = open('/tmp/test.txt') >>> f.rea ...

  5. Stream 分布式数据流的轻量级异步快照

    1. 概述 分布式有状态流处理支持在云中部署和执行大规模连续计算,主要针对低延迟和高吞吐量.这种模式的一个最根本的挑战就是在可能的失败情况下提供处理保证.现有方法依赖于可用于故障恢复的周期性全局状态快 ...

  6. 04 Redis主从同步

    redis主从同步 原理:1. 从服务器向主服务器发送 SYNC 命令.2. 接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下来执行的所有写命令.3 ...

  7. colspan和rowspan

    colspan和rowspan这两个属性用于创建特殊的表格. colspan用来指定单元格横向跨越的列数:colspan就是合并列的,colspan=2的话就是合并两列. rowspan用来指定单元格 ...

  8. 关于IDEA,多服务运行 Services -> Run Dashboard 部分服务添加变灰色,限制使用5个启动类,重启之后需要重新添加,服务在 Run Dashboard 中的显示排序问题,不显示 Services(Run Dashboard)

    我的IDEA版本为最新版本 变灰色的原因就是因为右键删除了那个启动的主配置类,然后就会显示灰色,再次打开这个醒目,就不会在Run Dashboard中显示这个主配置类了 解决方法 如果你要 调整这些服 ...

  9. 织梦多个栏目arclist调用副栏目不显示的解决办法

    织梦arclist调用副栏目不显示,网上关于这个问题的解决办法有很多,其中一种是: 打开/include/taglib/arclist.lib.php,代码约位于295-296行(我目前用的DedeC ...

  10. MySQL select之后再update

    1.先查询页面 而后再根据查询的结果来更改数据库,可以使用SELECT …… FOR UPDATE 来实现,具体的代码如下 SELECT * FROM chat //查询的表 //查询的条件 FOR ...