[koa] 采用koa-multer进行文件上传,上传到腾讯云

707 阅读1分钟

第一次采用koa来编写接口,准确来说是第一次编写接口哈哈哈。万事开头难,又想最快的时间出结果,最终是网上找了一个简单的后台项目,然后就在这上面愉快的开始开发了。作为一名纯前端,一开始还是有些懵的,只能参照前辈的写法模仿者写些简单的接口(现在也还是哈哈哈)。

上传文件是后台项目最常见的接口之一了,网上一顿找发现大家一般都采用koa-body。 目前项目采用的是koa-bodypaser,妥妥的引发报错了。 koa-body和koa-bodypaser同时使用会出现冲突,一般koa-body用来替换koa-bodypaser 和koa-multer。 下面就是采用koa-multer来进行文件的上传了。

参考链接

上传腾讯云配置

var COS = require('cos-nodejs-sdk-v5');
 
const cosUtil = {
    cos: null,
    Bucket: 'test-comm-1302801269',  // 存储桶名称
    Region: 'ap-shanghai',   // 存储桶区域
    Prefix: '/test-source',   // 路径前缀
 
    // 初始化配置
    init(config) {
        if(config){
            this.Bucket = config.Bucket || this.Bucket;
            this.Region = config.Region || this.Region;
            this.Prefix = config.Prefix || this.Prefix;
        }
 
        // 下面两个密钥,需要在腾讯云获取(具体在用户-访问设置进行配置获取)
        this.cos = new COS({
            SecretId: 'xxxxxx',   // 密钥id
            SecretKey: 'xxxxxxxx'  // 密钥key
        });
    },
 
    putObject(param, callback) {
        return new Promise((resolve, reject) => {
            this.cos.putObject({
                Bucket: this.Bucket, /* 必须 */
                Region: this.Region,    /* 必须 */
                Key: param.key,              /* 必须 */
                Body: param.buffer, /* 必须 */
            }, function (err, data) {
                if (err) {
                    reject(err);
                    return;
                }
                resolve(data)
            });
        })
    }
}
 
 
module.exports = cosUtil

上传接口

const multer = require("@koa/multer");
cosUtil

/**
 * 文件上传
 */
//上传文件本地存放路径、及文件命名(由于实际项目直接上传到阿里云了,这里可以直接跳过)
const storage = multer.diskStorage({
  // destination: function (req, file, cb) {
  //   cb(null, path.join(__dirname, "../../public"));
  // },
  // filename: function (req, file, cb) {
  //   let type = file.originalname.split(".")[1];
  //   cb(null, `${file.fieldname}-${Date.now().toString(16)}.${type}`);
  // },
});
//文件上传限制
const limits = {
  fields: 10, //非文件字段的数量
  fileSize: 500 * 1024, //文件大小 单位 b
  files: 1, //文件数量
};
const upload = multer({ storage, limits });

router.post("/upload/file", upload.single("file"), async (ctx, next) => {
  let file = ctx.file;

  let uppath = file.path;
  // 创建可读流
  let reader = fs.createReadStream(uppath);
  console.log(file.originalname.split('.'),'originalname');
  

  const extName = file.originalname.split(".")
  let newFilename = new Date().getTime() + "." + extName[extName.length - 1];
  cosUtil.init();

  let cosResult = await cosUtil.putObject({
    key: `test-source/upload/${newFilename}`, // oss存放路径
    buffer: reader,
  });

  ctx.body = {
    error: 0,
    url: `https://${cosResult.Location}`,
  };
});