前言
老以前就注册了七牛云的对象存储,一直没用上。
最近想着不用白不用,毕竟白嫖的,就研究了下Egg怎么上传。
试过没问题后,简单记录下
安装依赖
npm install qiniu
相关代码
// controller/qiniu.js
const Controller = require('egg').Controller;
class QiniuController extends Controller {
async uploadFiles() {
const ctx = this.ctx;
const result = await ctx.service.qiniu.uploadFiles(ctx);
if (result) {
ctx.body = result;
} else {
ctx.body = {
message: "上传失败"
}
}
}
}
// service/qiniu.js
const Service = require("egg").Service;
const fs = require("fs");
const path = require("path");
const qiniu = require("qiniu");
const md5 = require("md5");
//需要填写你的 Access Key 和 Secret Key , bucket空间
const accessKey = 'Access Key';
const secretKey = 'Secret Key';
const bucket = 'bucket';
const mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
const config = new qiniu.conf.Config();
config.zone = qiniu.zone.Zone_z0; // 空间对应的机房
const options = {
scope: bucket,
expires: 7200,
force: true,
callbackBodyType: 'application/json'
};
const putPolicy = new qiniu.rs.PutPolicy(options);
const uploadToken = putPolicy.uploadToken(mac);
class qiniuService extends Service {
async uploadFiles(data) {
const timestamp = (new Date()).getTime(); // 当前时间戳
const randomNum = Math.ceil(Math.random()*1000); // 取1000以下的随机数
try {
const stream = await data.getFileStream(); // 文件不存在将响应400错误
const extname = path.extname(stream.filename).toLocaleLowerCase();
const filename = md5(path.basename(stream.filename, extname) + timestamp + randomNum) + extname;
const formUploader = new qiniu.form_up.FormUploader(config);
const putExtra = new qiniu.form_up.PutExtra();
const result = await new Promise((resolve, reject) => {
formUploader.putStream(uploadToken, filename, stream, putExtra, function(respErr, respBody, respInfo) {
if (respErr) {
throw respErr;
}
if (respInfo.statusCode == 200) {
resolve(respBody);
} else {
reject(respBody);
}
});
});
if (result != "") {
return {
data: result
};
} else {
return false;
}
} catch (err) {
return false;
}
}
}