自己动手开发更好用的markdown编辑器-05(粘贴上传图片)

这里文章都是从个人的github博客直接复制过来的,排版可能有点乱. 原始地址 http://benq.im/2015/04/28/hexomd-05/

文章目录

  1. 1. 七牛云存储

    1. 1.1. 系统设置
    2. 1.2. 配置七牛帐号
  2. 2. 图片上传
  3. 3. 总结
  4. 4. 附件

上一篇我们实现了实时预览功能.

今天这篇要利用免费的七牛云存储服务来实现粘贴自动上传图片的功能,涉及到以下三个内容:

  1. 七牛云存储.
  2. clipboard-apis
  3. ajax文件上传

不想看过程的朋友可以直接下载打包好的程序使用,使用之前记得配置七牛帐号,否则无法自动上传图片.

七牛云存储

系统设置

首先在系统设置里增加七牛空间设置部分,这里就简单的贴上代码,因为系统设置模块之前几篇了都讲过了.

system/model.js

12345678910111213141516171819202122
...  //默认设置  var defaultSystemData = {    //最后一次打开的文件    lastFile: null,    //编辑器样式    theme:‘ambiance‘,    //预览窗口样式    preViewTheme:‘github‘,    //预览代码块样式    preViewHighLightTheme:‘default‘,

    /*七牛空间设置*/    accessKey:‘‘,    secretKey:‘‘,    //空间名称    bucketName:‘test‘,    //空间访问地址    bucketHost:‘7xit3a.com1.z0.glb.clouddn.com‘,    //过期时间,从设置之后多少小时过期.    deadline:1000  };

system.html

12345678910111213141516171819202122
...    <div class="form-group">      <label>AccessKey</label>      <input class="form-control" name="accessKey" ng-model="systemSetting.accessKey"/>    </div>    <div class="form-group">      <label>SecretKey</label>      <input class="form-control" name="secretKey" ng-model="systemSetting.secretKey"  type="text"/>    </div>    <div class="form-group">      <label>空间名</label>      <input class="form-control" name="bucketName" ng-model="systemSetting.bucketName" type="text"/>    </div>    <div class="form-group">      <label>空间域名</label>      <input class="form-control" name="bucketHost" ng-model="systemSetting.bucketHost" type="text"/>    </div>    <div class="form-group">      <label>过期时间</label>      <input name="deadline" class="form-control" ng-model="systemSetting.deadline" type="number"/>    </div>...

增加了accesskey,secretkey,空间名,过期时间四个用于上传图片的字段. 其中accesskey, secretkey用于验证权限,空间名用于指定上传图片的存储空间,过期时间指定授权的过期时间. 这四个字段共同组成上传授权的Token,生成的方法如下:

安装七牛nodejs版sdk

1
npm install qiniu --save

system/model.js

123456789101112
...  //生成七牛存储空间token  system.qiniuKeygen = function(systemSetting){    var qiniu = require(‘../app/node_modules/qiniu‘);    qiniu.conf.ACCESS_KEY = systemSetting.accessKey;    qiniu.conf.SECRET_KEY = systemSetting.secretKey;    var putPolicy = new qiniu.rs.PutPolicy(systemSetting.bucketName);    putPolicy.expires = Math.round(new Date().getTime() / 1000) + systemSetting.deadline * 3600;    systemSetting.qiniutoken = putPolicy.token();    return systemSetting;  };...

配置七牛帐号

首先得注册一个七牛帐号.

进入后台,新建一个空间,我这里取的空间名为blog,用于我博客的图片存储.

选择新建的空间,点击空间设置>域名设置,查看自动分配的域名

回到后台首页,点击账号设置,可以查看accessKey(AK)SecretKey(SK)

在刚做好的后台里配置好这几个字段

我把我空间的密钥遮住了,大家请填上自己的空间密钥

图片上传

图片的存储空间准备好了,现在来实现上传的功能.

初始化editor的时候传入七牛的token
studio/directive.js

1234567891011121314151617
...studio.directive(‘hmdEditor‘, function () {    return function ($scope, elem) {      var systemData = hmd.system.get();      hmd.editor.init({        el:elem[0],        theme:systemData.theme,        //七牛云存储授权        qiniuToken:hmd.system.qiniuKeygen(systemData).qiniutoken,        //空间的域名        bucketHost:systemData.bucketHost      },systemData.lastFile);      //保存最后一次打开的文件      hmd.editor.on(‘setFiled‘,function(filepath){        hmd.system.setLastFile(filepath);      });...

studio/editor里实现图片上传功能

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
...initQiniu:function(options){  this.qiniuToken = options.qiniuToken;  this.bucketHost = options.bucketHost;  //监听粘贴事件  $(‘.studio-wrap‘)[0].onpaste = this.uploadImage.bind(this);},uploadImage:function(ev){  var clipboardData, items, item;  if(!this.qiniuToken){    this.fire(‘error‘,{msg:‘未设置七牛密钥,无法上传图片‘});  }  //如果粘贴的是图片  else if (ev && (clipboardData = ev.clipboardData) && (items = clipboardData.items) &&      (item = items[0]) && item.kind == ‘file‘ && item.type.match(/^image\//i)) {    //取图片数据    var blob = item.getAsFile();    //生成随机的图片名    var fileName = this.guid() + ‘.‘ +  blob.type.split(‘/‘)[1];    //上传    this._qiniuUpload(blob, this.qiniuToken, fileName, function (blkRet) {      //生成markdown格式的图片地址      var img = ‘![](http://‘+this.bucketHost+‘/‘ + blkRet.key + ‘)‘;      //在光标处插入图片      this.cm.doc.replaceSelection(img);    }.bind(this));    return false;  }},//上传图片,参数为:图片2进制内容,七牛token,文件名,回调函数_qiniuUpload:function (f, token, key,fn) {  var xhr = new XMLHttpRequest();  //创建表单  xhr.open(‘POST‘, ‘http://up.qiniu.com‘, true);  var formData, startDate;  formData = new FormData();  if (key !== null && key !== undefined) formData.append(‘key‘, key);  formData.append(‘token‘, token);  formData.append(‘file‘, f);  var taking;

  xhr.onreadystatechange = function (response) {    //上传成功则执行回调    if (xhr.readyState == 4 && xhr.status == 200 && xhr.responseText) {      var blkRet = JSON.parse(xhr.responseText);      fn(blkRet);    } else if (xhr.status != 200 && xhr.responseText) {      if(xhr.status == 631){        hmd.editor.fire(‘error‘,{msg:‘七牛空间不存在.‘});      }      else{        hmd.editor.fire(‘error‘,{msg:‘七牛设置错误.‘});      }    }  };  startDate = new Date().getTime();  //提交数据  xhr.send(formData);}...

至此这个功能就完成了,这个功能较为简单,因此今天篇幅较小.

总结

粘贴上传图片的功能让我不用频繁的停下来上传图片,可以大大的提高用markdown写文章的效率.
目前功能还较为简单,不能指定图片名,不能分目录,大家可以根据自己的需求修改代码,完善功能.

接下来的计划:

  1. 自动更新.
  2. 云同步.
  3. 插件机制
  4. 表情插件.

附件

本篇程序打包,七牛云存储未设置好,请自行根据教程设置.
项目地址

时间: 2024-08-08 22:31:15

自己动手开发更好用的markdown编辑器-05(粘贴上传图片)的相关文章

自己动手开发更好用的markdown编辑器-04(预览功能)

这里文章都是从个人的github博客直接复制过来的,排版可能有点乱. 原始地址 http://benq.im/2015/04/25/hexomd-04/ 程序打包 文章目录 1. 打开新窗口 2. 预览功能 3. 优化体验 3.1. 滚动条随动 3.2. 样式美化 3.3. 代码块高亮 3.4. 关闭主程序前先自动关闭预览窗口 4. 总结 5. 附件 上一篇我们实现了系统模块的一些功能,对angular的使用更深入了一点. 今天这篇我们要实现实时预览的功能,将学习到如何使用nw.js打开额外新窗

这些小工具让你的Android 开发更高效

在做Android 开发过程中,会遇到一些小的问题,虽然自己动手也能解决,但是有了一些小工具,解决这些问题就得心应手了,今天就为大家推荐一下Android 开发遇到的小工具,来让你的开发更高效. Vysor Vysor 是一个可以将手机的屏幕投影到电脑上,当然也可以操作,当我们做分享或者演示的时候,这个工具起到了作用. Vector Asset Android Studio 在1.4 支持了VectorAsset,所谓VectorAsset:它可以帮助你在Android 项目中添加Materia

atitit.自己动手开发编译器and解释器(2) ------语法分析,语义分析,代码生成--attilax总结

atitit.自己动手开发编译器and解释器(2) ------语法分析,语义分析,代码生成--attilax总结 1. 建立AST 抽象语法树 Abstract Syntax Tree,AST) 1 2. 建立AST 语法树----递归下降(recursive descent)法 2 3. 语法分析概念 2 3.1. 上下文无关语言,非终结符(nonterminal symbol),终结符(terminal symbol).注 2 3.2. 最左推导.当然也有最右推导 3 3.3. 分支预测的

Markdown编辑器开发记录(一):开发的初衷和初期踩的坑

先说下选择Markdown编辑器的原因,我们进行平台开发,需要很多的操作手册和API文档,要在网站中展示出来就需要是HTML格式的文件,但是由于内容很多,不可能全部由技术人员进行文档的编写,如果是只有文档操作经验的人来做就会出现很麻烦的情况. 最初,我们先用试着用word来写,再转换成HTML文件保存,但是这样存在几个问题:1.转换出来的文件标签和样式十分的杂乱和冗余,有太多无用的标签,后期要修改样式也十分不容易:2.图片无法保存,在word文档中插入的图片路径是固定的物理路径,或是与文档一起存

让开发更简单 —— Coding Enterprise 发布

今天,我们很高兴地宣布 Coding Enterprise 发布了 -- Coding Enterprise 是 CODING 专为企业打造的软件开发协作平台,提供了针对中小型企业的公有云版本和针对大型企业的私有云版本,功能覆盖所有的开发场景,可以帮助企业更高效便捷地进行开发协作,真正实现一站式开发. 简单易用,安全高效 CODING 团队拥有 3 年多的互联网平台级产品开发和运营经验,旗下 Coding.net 云端软件开发协作平台已积累了 35 万多名的用户及 60 万多个项目,包括 Lin

atitit.自己动手开发编译器and解释器(1) ------词法分析--attilax总结

atitit.自己动手开发编译器and解释器(1) ------词法分析--attilax总结 1.   应用场景:::DSL 大大提升开发效率 1 2. 2. 流程如下::: 词法分析(生成token流) >>>>语法分析(生成ast) >>解释执行... 2 3. 如何进行词法分析?Fsm状态机(自动机) 2 4. 使用状态模式构建FSM  (简单,易用..推荐首选) 2 5. ---代码( 状态模式构建FSM ) 3 6. 词法分析概念 3 6.1. 词法分析(英

chrome快捷键,让开发更快捷:

9:18 2015/12/9chrome快捷键,让开发更快捷:部分:按住 Ctrl 键,然后点击链接 从后台在新标签页中打开链接,但您仍停留在当 前标签页中 按住 Ctrl+Shift 键,然后点击链接 在新标签页中打开链接,同时切换到新 打开的标签页 按住 Shift 键,然后点击链接 在新窗口中打开链接 Alt+F4 关闭当前窗口 Ctrl+Shift+T 重新打开上次关闭的标签页.谷歌浏览器可记住最近关闭的 10 个 标签页. 将链接拖动到标签页内 在指定标签页中打开链接 将链接拖动到两个

在嵌入式学习困惑:做驱动开发还是做应用开发更有前途

在嵌入式学习过程中,很多人都有这样的困惑! 意思就是说,"你告诉我哪个更有前途,我就好好学哪个,另外一个就不用学了".问这种问题的同事往往会同时问另外一些问题:我以后就想做驱动开发,你教我这些应用开发的技术有什么用?C++用得多吗?学了有什么用?我以后不想做GUI,你教我Qt有什么用? 学习最忌讳的就是"有用的就学,没有用的就不学"这种功利的态度.两个问题:第一,在你还没学进去.还不了解这种技术时,要如何判断这种技术学了有没有用?只能是根据道听途说,看各种论坛上都怎

自己动手开发IOC容器

前两天写简历,写了一句:精通Spring IoC容器.怎么个精通法?还是自己动手写个IOC容器吧. 什么是IoC(Inversion of Control)?什么是DI(Dependency Injection)?不多解释,自己Google!希望你先明确几个概念,该文章不做这方面的阐述,重点关注如何实现.我将用简要的语言从需求,设计,代码三方面来描述一个简单的IoC容器,来说明IoC容器是如何帮我们创建类的实例.如何实现依赖注入,最后会奉上一个完整的IoC容器实例. 一.需求,实现一个IoC容器