因为对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. c# 无法打开计算机.上的 服务,c# - C#Winform应用程序无法在其他计算机上运行(神秘的启动时) - 堆栈内存溢出...
  2. ubuntu 安装 lamp 环境
  3. 网络流之 最短增广路算法模板(SAP)
  4. Java 线上问题排查神器 Arthas 快速上手与原理浅谈
  5. c语言图形界代码,求个用最简单的的代码来实现图形界面…
  6. mysql中定时任务_mysql中定时任务的用法
  7. mysql分页查询关键_MySQL优化教程之超大分页查询
  8. ELK学习笔记之Elasticsearch启动常见错误
  9. android仿饿了么筛选,Android仿饿了么搜索功能
  10. 游戏开发之深拷贝与浅拷贝(C++基础)
  11. 23种设计模式(十九)数据结构之组合模式
  12. 20191006每日一句
  13. php共享单车项目教学,共享单车怎么充电的
  14. Android学习系列(30)--App列表之下拉刷新
  15. Java 实现PDB数据库中蛋白质部分序列与Uniport数据库中相应的全长序列的最优匹配
  16. 软件工程复习笔记——第六章 软件维护
  17. dnf台服空白mysql文件夹_关于雨泪大神的架设教程遇到的各种问题的解决办法
  18. 【node.js】识别图片中的文字
  19. 产品上ref和lot是什么意思_产品上的LOT是什么意思?
  20. 使用余弦定理计算反三角函数却报超出定义域

热门文章

  1. 为什么说Tcl是最好的语言?
  2. ubuntu 安装软件(tar.gz / deb)
  3. C# Excel 生成图表,添加趋势线、误差线
  4. Python趣味代码
  5. 密码学小知识(6):变色龙哈希函数(Chameleon Hash)
  6. linux 如何设置待机时间_虚拟机linux系统怎样设置待机时间
  7. DCMTK 打印胶片实验
  8. java-php-python-ssm计算机数字逻辑在线学习系统计算机毕业设计
  9. R语言 : 画散点图
  10. *测试用例Test Case