这是我的service 文件,
const Service = require('egg').Service
const qiniu = require('qiniu')
const path = require('path')
const sendToWormhole = require('stream-wormhole')
//需要填写你的 Access Key 和 Secret Key
qiniu.conf.ACCESS_KEY = ''
qiniu.conf.SECRET_KEY = ''
//要上传的空间
const bucket = ''
let mac = new qiniu.auth.digest.Mac(qiniu.conf.ACCESS_KEY, qiniu.conf.SECRET_KEY)
const options = {
scope: bucket,
expires: 60 * 60
}
class Qiniu extends Service {
/**
* @desc 七牛云文件上传
* */
async uploadFile (stream) {
const { ctx, app } = this
const filename = Date.now() + '' + Number.parseInt(Math.random() * 10000) + path.extname(stream.filename)
let uploadToken = await app.redisGet('uploadToken:token')//从redis获取七牛上传token
if (!uploadToken) {//如果不存在,就重新生成一个
let putPolicy = new qiniu.rs.PutPolicy(options)
uploadToken = putPolicy.uploadToken(mac)
await app.redisSet('uploadToken:token', uploadToken, options.expires)
}
let config = new qiniu.conf.Config()
config.zone = qiniu.zone.Zone_z2
const formUploader = new qiniu.form_up.FormUploader(config)
const putExtra = new qiniu.form_up.PutExtra()
try {
const data = await new Promise((resolve, reject) => {
/*
* formUploader 有好几种上传方法,
* putStream 数据流上传
* put 表单上传
* putFile 指定本地文件上传
* */
formUploader.putStream(uploadToken, filename, stream, putExtra, function (respErr,
respBody, respInfo) {
if (respErr) {
return reject(respErr)
}
if (respInfo.statusCode === 200) {
resolve(respBody.key)
} else {
return reject(respBody)
}
})
})
return {
filePath: app.config.qiniuUrl + data,
savePath: data
}
} catch (e) {
// 必须将上传的文件流消费掉,要不然浏览器响应会卡死
await sendToWormhole(stream)
return JSON.stringify(e)
}
}
}
module.exports = Qiniu