使用node一件上传文件到七牛cdn 脱离机械试操作

479 阅读2分钟

由于项目大量使用cdn且存储空间不同 导致每次项目打包完成以后上传文件变为一个工作量大且无聊的事情

就逛了一下七牛开发者工具 发现有node的jdk 于是便开始摸索起来

下面是一个简单的单空间文件上传demo

其实官方文档还是比较清楚的 node.js sdk 传送门

简单的整个文件上传

这里只是做一下笔记方便下次参考


1.首先安装依赖 安装七牛官方node sdk

npm i qiniu

2.然后开始编写脚本

// deployOss.js

// 引入相关依赖
let qiniu = require("qiniu")
let fs = require("fs");
const {resolve} = require("path")

// 七牛sdk相关配置
// accessKey secretKey 可以从账号 个人中心 秘钥管理里面获取
let mac = new qiniu.auth.digest.Mac('accessKey', 'secretKey');

let bucket = 'allapplication';// 要上传的空间

// 七牛sdk的初始化 这里使用FormUploader上传
let qnConfig = new qiniu.conf.Config();
let formUploader = new qiniu.form_up.FormUploader(qnConfig);

//获取需要上传文件夹下的所有文件  这里 保存在了filesList 实际也可以在获取的时候直接上传
let filesList = [];
let fileurllist = getFileList(resolve(process.cwd(), 'dist'))

// 遍历上传
fileurllist.forEach(item => {
  putFile(item)
})

// 上传文件 localFile 是本地文件路径
function putFile (localFile) {
  // 这里是将文件路径与bucket路径对应上
  let objectUrl = localFile.split('dist\\')[1].replace(/\\/g, '/') 
  
  // 文件类型 自动获取 也可以手动指定
  let putExtra = new qiniu.form_up.PutExtra();
  // putExtra.mimeType = localFile.type=="html"?"text/html":(localFile.type=="css"?"text/css":"application/javascript");
  
  // 这里是覆盖上传的的配置 因为七牛默认已存在的文件不能重复上传
  // 填写对应的空间名称和文件路径
  let options = {
    scope: `${bucket}:${objectUrl}`
  }

  // 获取token
  let putPolicy = new qiniu.rs.PutPolicy(options);
  let uploadToken=putPolicy.uploadToken(mac);
  
  // // 执行上传
  formUploader.putFile(
    uploadToken,
    objectUrl,
    localFile,
    putExtra,
    function(respErr, respBody, respInfo) {
      if (respErr) {
        console.log(respErr);
        throw respErr;
      }
      if (respInfo.statusCode == 200) {
        console.log(`${localFile}---上传到--->${objectUrl}--->上传成功`);
      } else {
        console.log(respInfo.statusCode);
        console.log(respBody);
      }
    }
  );
}


//获取文件夹下的所有文件
//不能上传目录 所以要获取所有文件的路径
function getFileList (fileurl) {
  let files = fs.readdirSync(fileurl);
  files.forEach(file => {
    let pathUrl = resolve(fileurl, file)
    let stat = fs.statSync(pathUrl);
    if(stat.isDirectory()) {
      getFileList(pathUrl)
    }else{
      filesList.push(pathUrl)
    }
  })
  return filesList;
}

到这里基本的上传功能已经完成

可以根据此基础 在添加一些复杂的业务逻辑 比如

  • 抽离七牛配置 做到上传到不同的账号或者空间
  • 抽离本地需要上传的文件路径配置 可以灵活配置需要上传的目录
  • 添加项目配置 做到不同项目上传到不同的空间或不同的账户或者不同的空间路径