Atom中七牛图床配置+解决无法上传的问题

来源:互联网 发布:福建随行软件 编辑:程序博客网 时间:2024/06/08 16:01

基于Atom安装七牛图床

>1、安装qiniu-uploader和markwodn-assistant

步骤:点击文件,然后打开设置,随后点击安装,先安装qiniu-uploader


qiniu

然后安装markwodn-assistant

mark




>2、配置ainiu-uploader

首先注册七牛云的会员,进入控制管理台
cunchu


新建存储空间
xinjian


获取 AK 和 SK
点击右上角的 个人面板 下的 密钥管理,在新的页面中点击 创建密钥,就会生成 AK 和 SK ,进入个人中心-密钥管理,如图:
miyao


>3、配置qiniu-uploader

点击文件-设置-扩展,找到qiniu-uploader,点击setting,然后配置如下图:

peizhi
接下来解决不能上传的问题


解决Bug

先附上错误图
11


需要手动替换三个文件,这个三个文件在 ~/.atom/packages/qiniu-uploader/node_modules/qiniu/qiniu 目录中,这三个文件分别是 :


>1、io.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;
}
// @endgist
function 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);

}


>2、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;
}

>3、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());
      //判断设置使用的协议, 默认使用http
      if (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);
          //判断设置使用的协议, 默认使用http
          if (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;
}

将上述三个文件中的内容删除掉,换成上面的代码,然后重启Atom,就ok了。

原创粉丝点击