七牛图床上传 - ZJH9Rondo/Blog-Node GitHub Wiki

关于配置七牛文件上传

本项目如何使用

  • 配置文件编写

这里,无论如何不要泄露你的secertKey,我之前就是在一一位用户的Github项目中遇到过写ReadME时忘记移除,导致被滥用的问题

      // /config/qiniu_user.js
       module.exports = {
        'ACCESS_Key': '你当前七牛的accessKey',
        'SECRET_Key': '你当前七牛的secertKey',
        'OPTIONS': {
          scope: '你七牛目的空间的Bucket'
        }
      };

配置文件导出之后,是在/routes/upload_qiniu.js中进行token的验证获取的,这里,如果使用node编写的后台,那么需要下载qiniu package,我在项目依赖中都已写入,只需在项目初始启动前npm install 即可,而相关的在七牛官方文档中均有详细说明。

 /*
* 获取客户端上传token
*   ZJH9Rondo
*/
var express = require('express');
var router = express.Router();
var qiniu = require('qiniu');
var qiniu_user = require('../config/qiniu_user');

// 获取客户端所需token
router.get('/getToken',function (req,res,next){
  var mac = new qiniu.auth.digest.Mac(qiniu_user.ACCESS_Key,qiniu_user.SECRET_Key);

  var putPolicy = new qiniu.rs.PutPolicy(qiniu_user.OPTIONS);
  var uploadToken=putPolicy.uploadToken(mac);

  if(uploadToken){
    res.json({
      'token': uploadToken
    });
  }
});

module.exports = router;
  • 由于这里是使用了七牛所支持的base64位直传方式,所以后端只负责接受请求并验证当前配置文件中的key值之后,向你在七牛所拥有的图床发起请求获取返回的token,前端在拿到token后直接利用Ajax向七牛提供的上传接口发起请求,携带后端返回的token,在上传成功后可以设置七牛的返回值,这个在七牛的开发者文档中都有详细介绍,这里要求返回的是图片所在的获取链接,然后做了处理,将图片的url做了转换,以Markdown的格式插入。
      // 客户端直传函数
      function upload_base64(base64_str,upload_url,token){
        var pic = base64_str,
            url = upload_url,
            xhr = new XMLHttpRequest();

        xhr.onreadystatechange = function (){
          if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200){
              var img = JSON.parse(xhr.responseText),
                  Imgsrc = '你七牛存储空间的自定义域名或者当前所绑定的域名' + img.key;

              markdown_IMG(Imgsrc);
          }
        };
        xhr.open("POST",url,true);
        xhr.setRequestHeader("Content-Type", "application/octet-stream");
        xhr.setRequestHeader("Authorization",'UpToken' + ' ' + token);
        xhr.send(pic);
     }

     // 获取token
     Ajax.init({
       url: '/getToken',
       method: 'get',
       datatype: 'json',
       success: function (result){

       base64_str = base64_str.replace(/^data:image\/\w+;base64,/, '');

       // 根据七牛开发文档描述,当前目的存储空间位置不同(华南、华北、北美),'*****'对应值不同
       // 根据需要自行更改
       upload_url = 'http://*******.qiniu.com/putb64/' + imageFile.size;
       result = JSON.parse(result);
       upToken = result.token;
       // 上传文件
       upload_base64(base64_str,upload_url,upToken);
     }
  • 但是使用客户端直传在这个项目中存在一个问题,就是还未对后端返回的token做一个加密操作,暂且token是明文的,但是流程是正确的,只需对token做一个加密,在发起上传操作时,对其解密即可,这样就不会出现token泄露或者被截获,当然,这只是我目前想到的解决办法,如果有更合适的办法或者哪里有错误,欢迎指正以及PR