资讯专栏INFORMATION COLUMN

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

wqj97 / 3860人阅读

摘要:将创建好的对象,再插入到编辑器中注意这里不用方法因为他会额外的标签具体查看,另外当选取本地文件的时候,此时的富文本编辑器会失去焦点,插入新的节点的时候,总是从起始点开始插入,而非从当前光标的位置进行插入。

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

</>复制代码

  1. // onChange callback
  2. $("#summernote").summernote({
  3. callbacks: {
  4. onChange: function(contents, $editable) {
  5. console.log("onChange:", contents, $editable);
  6. }
  7. }
  8. });
  9. // summernote.change
  10. $("#summernote").on("summernote.change", function(we, contents, $editable) {
  11. console.log("summernote"s content is changed.");
  12. })

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

</>复制代码

  1. //初始化定义
  2. var _this=this;
  3. this.curEle=$("#"+this.id);
  4. var fileUploadBtn=this.template;
  5. this.curEle.summernote({
  6. focus: true,
  7. lang:"zh-CN", //中文说明配置
  8. placeholder:"请输入内容",
  9. fontNames: ["宋体","微软雅黑","楷体","黑体","隶书", "Arial", "Arial Black", "Comic Sans MS", "Courier New",
  10. "Helvetica Neue", "Helvetica", "Impact", "Lucida Grande",
  11. "Tahoma", "Times New Roman", "Verdana"],
  12. height:400,
  13. minHeight:300,
  14. maxHeight:null,
  15. toolbar: [
  16. ["style", ["style"]],
  17. ["font", ["bold", "italic", "underline", "clear"]],
  18. ["fontname", ["fontname"]],
  19. ["color", ["color"]],
  20. ["para", ["ul", "ol", "paragraph","height"]],
  21. ["table", ["table"]],
  22. ["insert", ["fileBtn","media", "link", "picture", "video"]],
  23. ["view", ["fullscreen"]]
  24. ],
  25. buttons: {
  26. fileBtn: fileUploadBtn
  27. },
  28. callbacks: {
  29. onImageUpload: function (files,editor, $editable) {
  30. _this.sendFile(files[0]);
  31. },
  32. }
  33. })

</>复制代码

  1. methods:{
  2. sendFile(files){
  3. var _this=this;
  4. var data = new FormData();
  5. data.append("file", files);
  6. $.ajax({
  7. data : data,
  8. type : "POST",
  9. url : SERVICE_URLS.commonUrl.uploadPic.path, //此处为图片上传服务器请求地址,返回的是图片上传后的路径(例如:请求接口为http://120.96.35.20:8090/uploadPic)
  10. cache : false,
  11. contentType : false,
  12. processData : false,
  13. dataType : "json",
  14. success: function(data) {//举例data:{data:"http://www.test.com/a.jpg"}
  15. _this.curEle.summernote("insertImage", data.data);
  16. },
  17. error:function(){
  18. alert("上传失败");
  19. }
  20. });
  21. },
  22. template(context){ //此处为自定义附件上传按钮,如果只考虑图片上传请忽略
  23. let _this=this;
  24. var ui = $.summernote.ui;
  25. // create button
  26. var button = ui.button({
  27. contents: " 附件",
  28. tooltip: "文件上传",
  29. click: function () {
  30. _this.visibleUpload=true; //控制上传文件界面框可见性
  31. setTimeout(function(){
  32. _this.initUploader(); //初始化web uploader插件
  33. },0)
  34. }
  35. });
  36. return button.render(); // return button as jquery object
  37. }
  38. }

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方法,因为他会额外的


标签--具体查看issue,另外当选取本地文件的时候,此时的富文本编辑器会失去焦点,插入新的node节点的时候,总是从起始点开始插入,而非从当前光标的位置进行插入。所以尝试换种方法,利用设置code重新置换整个编辑框的内容。)

</>复制代码

  1. initUploader(){
  2. var _this=this;
  3. var $list=$("#uploadList");
  4. var state="pending";
  5. var $btn=$("#toServerBtn");
  6. var uploader = WebUploader.create({
  7. swf: "https://cdn.bootcss.com/webuploader/0.1.1/Uploader.swf",
  8. server: SERVICE_URLS.commonUrl.uploadFile.path, //自己服务器的文件上传接口
  9. pick: "#fileUpload",
  10. resize: false,
  11. fileNumLimit: 10,
  12. fileSizeLimit: 10 * 1024 * 1024,
  13. });
  14. this.uploader=uploader;
  15. // 当有文件被添加进队列的时候
  16. uploader.on( "fileQueued", function( file ) {
  17. $list.append( "
  18. " +
  19. "

    " + file.name + "

    " +
  20. "
    " +
  21. "

    等待上传

    " +
  22. "

    取消上传

    " +
  23. ""+
  24. "
    " +
  25. "
    " +
  26. ""+
  27. "
  28. " );
  29. if(file){
  30. _this.ifFileQueue=true;
  31. }
  32. });
  33. $list.on("click",".stateBox .cancelFile",function(event){
  34. var target=event.target.getAttribute("attr");
  35. uploader.removeFile( target,true );
  36. $("#"+target).remove();
  37. var status=uploader.getStats();
  38. if(status.queueNum==0){
  39. _this.ifFileQueue=false
  40. }else{
  41. _this.ifFileQueue=true;
  42. }
  43. })
  44. uploader.on( "uploadProgress", function( file, percentage ) {
  45. var $li = $( "#"+file.id ),
  46. $percent = $li.find(".progress .progress-bar");
  47. // 避免重复创建
  48. if ( !$percent.length ) {
  49. $percent = $("
    " +
  50. "
    " +
  51. "" +
  52. "").appendTo( $li ).find(".progress-bar");
  53. }
  54. $li.find("p.uploadState").text("上传中");
  55. $percent.css( "width", percentage * 100 + "%" );
  56. });
  57. uploader.on( "uploadSuccess", function( file,response ) {
  58. $( "#"+file.id ).find("p.uploadState").text("已上传");
  59. _this.$set( _this.fileList,_this.fileList.length,response.result[0])
  60. });
  61. uploader.on( "uploadError", function( file ) {
  62. $( "#"+file.id ).find("p.uploadState").text("上传出错");
  63. });
  64. uploader.on( "uploadComplete", function( file ) {
  65. $( "#"+file.id ).find(".progress").fadeOut();
  66. });
  67. uploader.on("uploadFinished",function(){ //重点在这里
  68. var str=``;
  69. for (var i = 0; i < _this.fileList.length; i++) {
  70. var item = _this.fileList[i];
  71. str+=`

    ${item.fileName}

    `;
  72. }
  73. var storageCode=_this.curEle.summernote("code");
  74. _this.curEle.summernote("reset");
  75. var node=$("
    "+storageCode+str+"
    ")[0];
  76. // _this.curEle.summernote("insertNode",node); //此处不用insertNode
  77. _this.curEle.summernote("code",node);
  78. setTimeout(()=>{
  79. _this.visibleUpload=false;
  80. },1000)
  81. });
  82. uploader.on( "all", function( type ) {
  83. if ( type === "startUpload" ) {
  84. state = "uploading";
  85. } else if ( type === "stopUpload" ) {
  86. state = "paused";
  87. } else if ( type === "uploadFinished" ) {
  88. state = "done";
  89. }
  90. if ( state === "uploading" ) {
  91. $btn.text("暂停上传");
  92. } else {
  93. $btn.text("开始上传");
  94. }
  95. });
  96. $btn.on( "click", function() {
  97. if ( state === "uploading" ) {
  98. uploader.stop();
  99. } else {
  100. uploader.upload();
  101. }
  102. });
  103. },

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/53305.html

相关文章

  • summernote(文本辑器)附件图片上传自己务器vue项目

    摘要:将创建好的对象,再插入到编辑器中注意这里不用方法因为他会额外的标签具体查看,另外当选取本地文件的时候,此时的富文本编辑器会失去焦点,插入新的节点的时候,总是从起始点开始插入,而非从当前光标的位置进行插入。 1.上传图片至自己的服务器(这个官方都有例子,重点介绍附件上传)图片上传官方网址 // onChange callback $(#summernote).summernote({ ...

    xiaoxiaozi 评论0 收藏0
  • 基于SpringBoot仿微信扫描登陆+轻量级文本编辑->文章系统

    摘要:微信的扫码的登陆是要企业号的,对于一个学生狗哪来企业号,自己有个测试号内心已十分满足。自己决心做一个仿微信扫码登陆,对,你没看错,就是仿,坚信高仿出奇迹。 前言 点击访问项目链接看到慕课网和segmentfault的发表手记和发表文章是Markdown 编辑器,说实话,对于第一次用的我真的很不习惯。不过对于我们代码开发者来写挺好的,也就对我们这些开发者述写自己的代码故事好点而已。这边我...

    MyFaith 评论0 收藏0
  • summernote辑器插件使用笔记

    摘要:由于需要的编辑器功能比较简单,不需要太多复杂功能,所以选择了一款特别轻量的插件,而且后台操作也很简单。关于图片上传提交按键等回调函数也是在中,详见部分。初始化一个编辑器很简单。 这次项目中需要用到编辑器插件,于是上网查了一下。由于需要的编辑器功能比较简单,不需要太多复杂功能,所以选择了一款特别轻量的summernote插件,而且后台操作也很简单。官网:http://summernote...

    printempw 评论0 收藏0
  • 手摸手,带你用vue撸后台 系列三(实战篇)

    摘要:社区的认可目前已经是相关最多的开源项目了,体现出了社区对其的认可。监听事件手动维护列表这样我们就简单的完成了拖拽排序。 完整项目地址:vue-element-admin 系类文章一:手摸手,带你用vue撸后台 系列一(基础篇)系类文章二:手摸手,带你用vue撸后台 系列二(登录权限篇)系类文章三:手摸手,带你用vue撸后台 系列三(实战篇)系类文章四:手摸手,带你用vue撸后台 系列...

    Channe 评论0 收藏0
  • 手摸手,带你用vue撸后台 系列三(实战篇)

    摘要:社区的认可目前已经是相关最多的开源项目了,体现出了社区对其的认可。监听事件手动维护列表这样我们就简单的完成了拖拽排序。 完整项目地址:vue-element-admin 系类文章一:手摸手,带你用vue撸后台 系列一(基础篇)系类文章二:手摸手,带你用vue撸后台 系列二(登录权限篇)系类文章三:手摸手,带你用vue撸后台 系列三(实战篇)系类文章四:手摸手,带你用vue撸后台 系列...

    zgbgx 评论0 收藏0

发表评论

0条评论

wqj97

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<