热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

今天这篇要利用免费的七牛云存储服务来实现粘贴自动上传图片的功能,涉及到以下三个内容:七牛云存储.clipboard-apisajax文件上传不想看过程的朋友可以直接
这里文章都是从个人的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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
...
//默认设置
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
...
class="form-group">
<label>AccessKeylabel>
<input class="form-control" name="accessKey" ng-model="systemSetting.accessKey"/>

class="form-group">
<label>SecretKeylabel>
<input class="form-control" name="secretKey" ng-model="systemSetting.secretKey" type="text"/>

class="form-group">
<label>空间名label>
<input class="form-control" name="bucketName" ng-model="systemSetting.bucketName" type="text"/>

class="form-group">
<label>空间域名label>
<input class="form-control" name="bucketHost" ng-model="systemSetting.bucketHost" type="text"/>

class="form-group">
<label>过期时间label>
<input name="deadline" class="form-control" ng-model="systemSetting.deadline" type="number"/>

...

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

安装七牛nodejs版sdk

1
npm install qiniu --save

技术分享

system/model.js

1
2
3
4
5
6
7
8
9
10
11
12
...
//生成七牛存储空间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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
...
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里实现图片上传功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
...
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. 表情插件.

附件

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

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


推荐阅读
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
author-avatar
春哥在奋斗_
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有