node实现上传文件(视频、图片、音乐)到七牛云存储。
2020-04-09 本文已影响0人
风中凌乱的男子
需求:node实现上传文件(视频、图片、音乐)到七牛云存储。
需要用到的模块
cnpm install qiniu --save
cnpm install formidable --save
确保安装成功后
1. 在项目内新建一个 qiniuConfig.js 文件,内容如下:
let config = {};
config.accessKey = 'dfFiJxxxxxxxxxxxxxxxxxxFxK72'; //七牛的AK
config.secretKey = 'Q1XfZHxxxxxxxxxxxxxxxcG-1_VqWA'; //七牛的SK
config.bucket = 'videoplan1'; //存储空间的名字
config.url = 'q8hx07sxxxxxlouddn.com'; //配置的域名,我直接用的他自己生成的
module.exports = config;
2. 然后在项目内在建一个 qiuniu.js ,文件内容如下,可直接复制使用,注意文件引入的路径:
let qiniu = require('qiniu');
let formidable = require('formidable');
let configs = require('../config/qiniuConfig');
let qn = {};
//要上传的空间
let bucket = configs.bucket; //七牛云存储的存储空间名
//构建上传策略函数 (获取七牛上传token)
qn.uptoken = function (bucket) {
var putPolicy = new qiniu.rs.PutPolicy({
scope: bucket
});
var accessKey = configs.accessKey;
var secretKey = configs.secretKey;
var mac = new qiniu.auth.digest.Mac(accessKey, secretKey);
var uploadToken = putPolicy.uploadToken(mac);
return uploadToken;
}
qn.upImg = function (req, callback) {
let callbackObj = {}; //回调函数返回的对象
var form = new formidable.IncomingForm(); //创建上传表单
form.encoding = 'utf-8'; //设置编辑
//form.uploadDir = '../../uploadimg'; //设置上传目录 设置则会存储在中控服务器,不设置则建立一个临时 文件 最后要上传到七牛,所以不用设置
form.keepExtensions = true; //保留后缀
form.maxFieldsSize = 5 * 1024 * 1024; //文件大小5M 报错413上传文件太大了
form.parse(req, function (err, fields, files) {
if (err) {
// res.locals.error = err;
callbackObj.status = 1;
callbackObj.msg = err;
console.log('err==', err);
return callback(callbackObj);
}
console.log(files.file.path);
//上传到七牛后保存的文件名
let key = new Date().getTime();
//生成上传 Token
let token = qn.uptoken(bucket);
//要上传文件的本地路径
let filePath = files.file.path; //如果是表单的数据提交会存储在fields中,图片文件提交会存储在files中 files.file中的file指的是前端设定input的name一般设置为file
//构造上传函数
// 文件上传(以下四行代码都是七牛上传文件的配置设置)
var config = new qiniu.conf.Config();
config.zone = qiniu.zone.Zone_z0; //设置传输机房的位置根据自己的设置选择
var formUploader = new qiniu.form_up.FormUploader(config);
var putExtra = new qiniu.form_up.PutExtra();
formUploader.putFile(token, key, filePath, putExtra, function (respErr, respBody, respInfo) {
if (respErr) {
callbackObj.status = 1;
callbackObj.msg = respErr;
return callback(callbackObj);
}
if (respInfo.statusCode == 200) { //上传成功
console.log(respBody);
// 输出 JSON 格式 xxx填写自己在七牛中设置的自定义域名
var response = {
"url": 'http://' + configs.url + '/' + key
};
console.log(response);
// res.end(JSON.stringify(response));
callbackObj.status = 0;
callbackObj.data = response;
return callback(callbackObj);
} else { //上传失败
console.log(respInfo.statusCode);
console.log(respBody);
callbackObj.status = 1;
callbackObj.msg = respBody;
return callback(callbackObj);
}
});
});
}
// console.log(qn.uptoken(bucket));
module.exports = qn;
3. 在然后在新建一个upload.js ,内容如下:
var express = require('express'); //引入express
var router = express.Router(); //定义路由级中间件
let qn = require('./qiniu');
//结果包装函数
let result = function (obj, bool) {
if (bool) {
return {
status: 0,
data: obj
};
} else {
return {
status: 1,
data: obj
};
}
}
//上传接口
router.post("/upImg", function (req, routerRes) {
qn.upImg(req, function (res) {
// console.log('res', res);
if (res.status == 0) {
routerRes.json(result(res.data, true));
} else {
routerRes.json(result(res.msg, false));
}
});
})
module.exports = router;
4. 最后别忘记在app.js引入
var upload = require("./routes/upload");
app.use('/api',upload)
5. 所以我的接口是 `http://localhost:5000/api/upImg`
返回的结果是这样的
![image.png](https://img.haomeiwen.com/i14379901/dab517962a149f52.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
七牛云后台是这样的:
![image.png](https://img.haomeiwen.com/i14379901/e99e6a64e8e2184a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
6. 学习交流➕v 1115009958 备注;前端学习交流