因为对markdown比较感兴趣,平时的文档编写都是用markdown来完成.以前是用csdn的博客编辑器,支持图片上传,预览. 最近在公司的文档也开始用markdown来写了,就会遇到一个问题:如何上传图片?

最开始我不知道图床啥的,就是自己先把图片上传到 github ,然后再手动引用连接到文章中,这样的也能实现markdown的图片引用. 但是不够优雅,而且很麻烦.上传一张图片有4到5步操作.

然后发现了 Atom编辑器的两个插件,使用 7牛 作为图床可以实现: qq截图,然后直接在 Atom 的编辑页面 ctrl+v 粘贴, 弹出上传图片提示,会让你填写一个 title ,点击enter会自动构建一条markdown图片语句。这样上传图片就完成了.

效果如下:

这个就是我一键上传的图片,是不是很简单! 下面我就给大家介绍实现的方法:

第一步, 注册7牛云

7牛云的注册,新建空间就不过多介绍了.

吴同学博客: 使用七牛作为github博客的图床

佚名大神博客: 如何使用七牛

相信大家可以搞定的.

第二步, 下载 markdown-assistant,qiniu-uploader 插件

安装好插件后还需要对它们进行设置:

设置markdown-assistant的时候发现,会让你填一个上传插件,而且默认已经帮你填好了qiniu-uploader,其实你也就什么都不用设置了。

如下图:

设置qiniu-uploader,主要设置四个参数:

qiniu-uploader 使用报错解决方法

我自己在使用 qiniu-uploader 时Atom提示错误,如下图:

可能你们也会遇到这个问题,
解决方案地址

这里我整理了一下:

  1. 先找到 Atom 的配置文件,再找到插件的安装路径. 我的电脑是Windows系统,路径是是这样的 : C:\Users\Administrator\.atom\packages\qiniu-uploader\node_modules\qiniu\qiniu

  2. 替换 \qiniu 文件夹下面: io.js,rpc.js,zone.js, 然后就ok了

这里我贴出来:

os.js

var conf = require('./conf');
var util = require('./util');
var rpc = require('./rpc');
var fs = require('fs');
var getCrc32 = require('crc32');
var url = require('url');
var mime = require('mime');
var Readable = require('stream').Readable;
var formstream = require('formstream');
var urllib = require('urllib');
var zone = require('./zone');exports.UNDEFINED_KEY = '?'
exports.PutExtra = PutExtra;
exports.PutRet = PutRet;
exports.put = put;
exports.putWithoutKey = putWithoutKey;
exports.putFile = putFile;
exports.putReadable = putReadable;
exports.putFileWithoutKey = putFileWithoutKey;// @gist PutExtra
function PutExtra(params, mimeType, crc32, checkCrc) {this.params = params || {};this.mimeType = mimeType || null;this.crc32 = crc32 || null;this.checkCrc = checkCrc || 0;
}
// @endgistfunction PutRet(hash, key) {this.hash = hash || null;this.key = key || null;
}// onret: callback function instead of ret
function putReadable (uptoken, key, rs, extra, onret) {if (!extra) {extra = new PutExtra();}if (!extra.mimeType) {extra.mimeType = 'application/octet-stream';}if (!key) {key = exports.UNDEFINED_KEY;}rs.on("error", function (err) {onret({code: -1, error: err.toString()}, {});});// 设置上传域名// zone.up_host(uptoken, conf);zone.up_host_async(uptoken, conf, function() {var form = getMultipart(uptoken, key, rs, extra);return rpc.postMultipart(conf.UP_HOST, form, onret);});}function put(uptoken, key, body, extra, onret) {var rs = new Readable();rs.push(body);rs.push(null);if (!extra) {extra = new PutExtra();}if (extra.checkCrc == 1) {var bodyCrc32 = getCrc32(body);extra.crc32 = '' + parseInt(bodyCrc32, 16);} else if (extra.checkCrc == 2 && extra.crc32) {extra.crc32 = '' + extra.crc32}return putReadable(uptoken, key, rs, extra, onret)
}function putWithoutKey(uptoken, body, extra, onret) {return put(uptoken, null, body, extra, onret);
}function getMultipart(uptoken, key, rs, extra) {var form = formstream();form.field('token', uptoken);if (key != exports.UNDEFINED_KEY) {form.field('key', key);}form.stream('file', rs, key, extra.mimeType);if (extra.crc32) {form.field('crc32', extra.crc32);}for (var k in extra.params) {form.field(k, extra.params[k]);}return form;
}function putFile(uptoken, key, loadFile, extra, onret) {var rs = fs.createReadStream(loadFile);if (!extra) {extra = new PutExtra();}if (extra.checkCrc == 1) {var fileCrc32 = getCrc32(fs.readFileSync(loadFile));extra.crc32 = '' + parseInt(fileCrc32, 16);} else if (extra.checkCrc == 2 && extra.crc32) {extra.crc32 = '' + extra.crc32}if (!extra.mimeType) {extra.mimeType = mime.lookup(loadFile);}return putReadable(uptoken, key, rs, extra, onret);
}function putFileWithoutKey(uptoken, loadFile, extra, onret) {return putFile(uptoken, null, loadFile, extra, onret);
}

rpc.js

var urllib = require('urllib');
var util = require('./util');
var conf = require('./conf');exports.postMultipart = postMultipart;
exports.postWithForm = postWithForm;
exports.postWithoutForm = postWithoutForm;function postMultipart(uri, form, onret) {return post(uri, form, form.headers(), onret);
}function postWithForm(uri, form, token, onret) {var headers = {'Content-Type': 'application/x-www-form-urlencoded'};if (token) {headers['Authorization'] = token;}return post(uri, form, headers, onret);
}function postWithoutForm(uri, token, onret) {var headers = {'Content-Type': 'application/x-www-form-urlencoded',};if (token) {headers['Authorization'] = token;}return post(uri, null, headers, onret);
}function post(uri, form, headers, onresp) {headers = headers || {};headers['User-Agent'] = headers['User-Agent'] || conf.USER_AGENT;var data = {headers: headers,method: 'POST',dataType: 'json',timeout: conf.RPC_TIMEOUT,};if (Buffer.isBuffer(form) || typeof form === 'string') {data.content = form;} else if (form) {data.stream = form;} else {data.headers['Content-Length'] = 0;};var req = urllib.request(uri, data, function(err, result, res) {var rerr = null;if (err || Math.floor(res.statusCode/100) !== 2) {rerr = {code: res&&res.statusCode||-1, error: err||result&&result.error||''};}onresp(rerr, result, res);});return req;
}

zone.js

// var request = require('urllib-sync').request;
var urllib = require('urllib');
var util = require('./util');
//conf 为全局变量
exports.up_host = function (uptoken, conf){var version = process.versions;var num = version.node.split(".")[0];// node 版本号低于 1.0.0, 使用默认域名上传,可以在conf中指定上传域名if(num < 1 ){conf.AUTOZONE = false;}if(!conf.AUTOZONE){return;}var ak = uptoken.toString().split(":")[0];var tokenPolicy = uptoken.toString().split(":")[2];var tokenPolicyStr = new Buffer(tokenPolicy, 'base64').toString();var json_tokenPolicyStr = JSON.parse(tokenPolicyStr);var scope = json_tokenPolicyStr.scope;var bucket = scope.toString().split(":")[0];// bucket 相同,上传域名仍在过期时间内if((new Date().getTime() < conf.EXPIRE) && bucket == conf.BUCKET){return;}//记录bucket名conf.BUCKET = bucket;var request_url = 'http://uc.qbox.me/v1/query?ak='+ ak + '&bucket=' + bucket;var res = request('http://uc.qbox.me/v1/query?ak='+ ak + '&bucket=' + bucket, {'headers': {'Content-Type': 'application/json'}});if(res.statusCode == 200){var json_str = JSON.parse(res.body.toString());//判断设置使用的协议, 默认使用httpif(conf.SCHEME == 'http'){conf.UP_HOST = json_str.http.up[1];}else{conf.UP_HOST = json_str.https.up[0];}conf.EXPIRE = 86400 + new Date().getTime();}else{var err = new Error('Server responded with status code ' + res.statusCode + ':\n' + res.body.toString());err.statusCode = res.statusCode;err.headers = res.headers;err.body = res.body;throw err;}}exports.up_host_async = function (uptoken, conf, callback){var version = process.versions;var num = version.node.split(".")[0];// node 版本号低于 1.0.0, 使用默认域名上传,可以在conf中指定上传域名if(num < 1 ){conf.AUTOZONE = false;}if(!conf.AUTOZONE){callback();return;}var ak = uptoken.toString().split(":")[0];var tokenPolicy = uptoken.toString().split(":")[2];var tokenPolicyStr = new Buffer(tokenPolicy, 'base64').toString();var json_tokenPolicyStr = JSON.parse(tokenPolicyStr);var scope = json_tokenPolicyStr.scope;var bucket = scope.toString().split(":")[0];// bucket 相同,上传域名仍在过期时间内if((new Date().getTime() < conf.EXPIRE) && bucket == conf.BUCKET){callback();return;}//记录bucket名conf.BUCKET = bucket;var request_url = 'http://uc.qbox.me/v1/query?ak='+ ak + '&bucket=' + bucket;var data = {contentType: 'application/json',method: 'GET',};var req = urllib.request(request_url, data, function(err, result, res) {// console.log(result);if(res.statusCode == 200){// console.log(result);var json_str = JSON.parse(result.toString());// console.log(json_str);//判断设置使用的协议, 默认使用httpif(conf.SCHEME == 'http'){conf.UP_HOST = json_str.http.up[1];}else{conf.UP_HOST = json_str.https.up[0];}conf.EXPIRE = 86400 + new Date().getTime();callback();return;}else{var err = new Error('Server responded with status code ' + res.statusCode + ':\n' + res.body.toString());err.statusCode = res.statusCode;err.headers = res.headers;err.body = res.body;throw err;callback();}});return;}

本文地址 https://marishunxiang.github.io/

Atom 编写 Markdown 一键上传图片,使用7牛云图床相关推荐

  1. Atom编写Markdown

    2019独角兽企业重金招聘Python工程师标准>>> Atom简介 Atom是GitHub开发的一款跨平台(Windows.Mac.Linux)文本编辑器,2015年Atom正式发 ...

  2. atom写css,Atom编写Markdown

    Atom编写Markdown Atom简介 Atom是GitHub开发的一款跨平台(Windows.Mac.Linux)文本编辑器,2015年Atom正式发布1.0版,开源,至于收费目前还没有听说,传 ...

  3. 七牛云图床php,PHP实现Markdown文章上传到七牛图床的实例内容

    在使用 Markdown 编写文章之后,经常需要发布到不同的平台,这里会遇到一个问题,文章的图片需要手动的进行上传,管理起来非常不方便,因此,强烈建议将图片统一上传到图床中,这样的话一篇文章就可以轻松 ...

  4. python实现自动上传图片_利用python脚本实现使用typora编写markdown时图片自动上传到chevereto图床...

    复制粘贴以下代码 #!/usr/bin/env python3 # -*- encoding: utf-8 -*- # author: guiu # data: 2020.2.28 import re ...

  5. Typora + PicGo + 七牛云图床

    Typora + PicGo + 七牛云图床 像我平常写博客的话,基本很少使用博客系统自带的编辑器,因为网页端很难达到客户端那样的流畅,偶尔还会出现网络问题,造成辛辛苦苦写完的内容丢失,而在客户端则不 ...

  6. 2020 新版typora-七牛云图床

    前言 Typora 作为 Markdown编辑器的扛把子,终于更新支持图片自动上传并返回相应的链接.废话不多说,直接看下面效果: 看这效果有木有很爽,以后写博客直接导入就OK,妈妈再也不用担心我为图片 ...

  7. flarum使用七牛云图床

    flarum版本:1.41 安装fofUpload文件上传插件: composer require fof/upload 安装qiniu插件: composer require "overt ...

  8. markdown快速入门之有道云笔记七牛图床与极简图床共舞

    markdown快速入门之有道云笔记&七牛图床与极简图床共舞 为了方便编写博客,由于我对markdown的简约写法情有独钟,我一直相信磨刀不误砍柴工的道理,于是花了一个下午研究如何能在以后的编 ...

  9. Alfred 有多强悍,我写了个一键上传图片的 workflow 来告诉你

    " 阅读本文大概需要 10 分钟. " 前言 一直以来用的都是 MarkEditor 写作,它有一个比较重要的功能:能自动将拷贝到编辑器中的截图同步到图床,这样如果要将文章导出发到 ...

最新文章

  1. EL:谁说N素含量高就不固氮了
  2. Android数据存储之文件存储(瞬时数据的存储与读取)项目已上传GitHub
  3. Redis进阶-bind参数详解
  4. 两年来的core折腾之路几点总结,附上nginx启用http2拿来即用的配置
  5. 提升对前端的认知,不得不了解Web API的DOM和BOM
  6. 命令行_Laravel-admin artisan 命令行脚本使用
  7. QT每日一练day3:Qt的编译机制
  8. 编程过度防御?只有缺乏自信的程序员才会这样做
  9. JQuery 常用积累(五)Datetimepicker和Lodop
  10. 相反数-网易校招编程题
  11. md5算法大作战推html5版本,MD5大作战
  12. Telink/BDT使用说明
  13. 以太网交换机和路由器的区别(转载)
  14. utc时间转换为时分秒_详解JavaScript UTC时间转换方法
  15. python3 爬虫神器pyquery的使用实例之爬网站图片
  16. springboot+vue基本微信小程序的疫情防控平台系统 计算机毕业设计
  17. 【Java项目】好客租房——数据库集群部署
  18. java 四舍六入五成双_显示格式的四舍六入五成双
  19. elementui固定表格头部
  20. 大专生出身?听说你在找SpringBoot整合案例?万字长文!

热门文章

  1. 拉动经济的三驾马车:消费、投资、出口
  2. 类属性和实例属性的区别
  3. 微通道产品经理Grover采访:美国的微通道设计
  4. linux中nginx上传文件方法,nginx加载webdav模块实现http协议上传文件
  5. Redis源码学习(10),t_hash.c 学习(一),hset、hmset 命令学习
  6. 综评计算机考试范围,南信大2021年综合评价录取考核开考,6000余名考生角逐合格资格...
  7. keil编写正弦函数_怎么用c语言编正弦函数计算
  8. 485通信原理_串口通信(232,485,422)以及常见问题
  9. linux的文件压缩打包操作,Linux文件管理-压缩打包
  10. 产品经理培训班大概多少钱