vue专题

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  备注;前端学习交流


上一篇下一篇

猜你喜欢

热点阅读