koa实现文件上传

  1. 首先要安装koa-body用于解析请求数据

     默认koa2-cli 自动生成的项目,采用的是koa-bodyparser, 这个sdk主要用开解析处理POST请求参数,但是这玩意有点缺陷,只能处理request payload 请求,

如:我们上传图片,需要传入的是图片的file 二进制流,所以采用request payload 就产生了问题!所以这个时候,如果你想用form data的格式,就需要继续依赖其他的sdk,如: koa2-formidable,

为什么使用koa-body?


在使用XMLHttpRequest2发送的FormData数据时,koa服务中除koa-body外,busboy、body-parse、multer、formidable、multiparty,均无法正确获取,也是经过经过测试发现的问题。

支持请求类型

  • multipart/form-data
  • application/x-www-urlencoded
  • application/json

使用koa-body 使用案例


const Koa = require('koa');
const app = new Koa();
const koaBody = require('koa-body');

app.use(koaBody({
  multipart:true, // 支持文件上传
  // encoding:'gzip',
}));

这里需要注释掉  encoding:'gzip' ,因为发现加上这个,回导致所有的请求出错,具体原因需要下次单独去探究


用上koa-body  其他地方就很easy 了,这是我的主要函数,

const OSS = require('ali-oss');
let fs = require('fs');

// 一些oss 的配置项
const client = new OSS({
   accessKeyId: 'xxxx',
   accessKeySecret: 'xxxx',
   bucket: 'xxx',
   region: 'xxxxx'
});

exports.upload = async (ctx, next) => {
  if ('POST' !== ctx.method) return await next();
  let file = ctx.request.files.file;
  try {
    const reader = fs.createReadStream(file.path);
    const myDate = new Date();
    var newFilename = myDate.getTime()+'.'+file.name.split('.')[1];
    await client.putStream(`article-img/${newFilename}`, reader);
    ctx.body = {
      code: 0,
      message: '上传成功'
    }
  } catch (err) {
    ctx.body = {
      code: -2,
      message: '上传失败'
    }
  }
};



这个博客的内容比较简单,今天我在这个上面花了不少时间,主要是在于使用了 koa-bodyparser 来解析请求,走了不少弯路,看到这个博客的人,希望可以跳过其他的无用功,直接使用 koa-body