【Koa】Koa利用中间件koa-body实现文件上传

  1,下载koa-body包

        npm install koa-body --save        官方API:https://cnpmjs.org/package/koa-body

  2,在项目中引入koa-body中间件

    // koaBody配置
    const koaBody = require('koa-body');
    app.use(koaBody({
      multipart: true, // 是否可以多选
      formidable: {
        maxFileSize: 200*1024*1024    // 设置上传文件大小最大限制,默认2M
      }
    }));

  3,获取上传的文件和保存

     1)上传单个文件:

    // 上传单个文件
    router.post('/fileUpload', async (ctx,next) => {
      // 获取上传文件
      // 新版本的koa-body通过ctx.request.files获取上传的文件
      // 旧版本的koa-body通过ctx.request.body.files获取上传的文件
      const file = ctx.request.files.file;
      // 创建可读流
      const reader = fs.createReadStream(file.path);
      let filePath = path.join(__dirname, '/upload/') + `/${file.name}`;
      // 创建可写流
      const upStream = fs.createWriteStream(filePath);
      // 可读流通过管道写入可写流
      reader.pipe(upStream);
      return ctx.body = "上传成功!";
    })

     2)上传多个文件:

    // 上传多个文件
    router.post('/uploadfiles', async (ctx, next) => {
      // 获取上传文件
      // 新版本的koa-body通过ctx.request.files获取上传的文件
      // 旧版本的koa-body通过ctx.request.body.files获取上传的文件
      const files = ctx.request.files.file; // 获取上传文件
      for (let file of files) {
        // 创建可读流
        const reader = fs.createReadStream(file.path);
        // 获取上传文件扩展名
        let filePath = path.join(__dirname, '/upload/') + `/${file.name}`;
        // 创建可写流
        const upStream = fs.createWriteStream(filePath);
        // 可读流通过管道写入可写流
        reader.pipe(upStream);
      }
      return ctx.body = "上传成功!";
    });

   4,完整代码:

const Koa = require('koa');
const app = new Koa();
const fs = require('fs');
const path = require('path');

// 注意require('koa-router')返回的是函数:
const router = require('koa-router')();
const bodyParser = require('koa-bodyparser');

// koaBody配置
const koaBody = require('koa-body');
app.use(koaBody({
  multipart: true, // 是否可以多选
  formidable: {
    maxFileSize: 200*1024*1024    // 设置上传文件大小最大限制,默认2M
  }
}));

// 上传文件页面
router.get('/file', async (ctx,next) => {
  ctx.response.body =
    `

表单提交:

`; await next(); }) // 上传单个文件 router.post('/fileUpload', async (ctx,next) => { // 获取上传文件 // 新版本的koa-body通过ctx.request.files获取上传的文件 // 旧版本的koa-body通过ctx.request.body.files获取上传的文件 const file = ctx.request.files.file; // 创建可读流 const reader = fs.createReadStream(file.path); let filePath = path.join(__dirname, '/upload/') + `/${file.name}`; // 创建可写流 const upStream = fs.createWriteStream(filePath); // 可读流通过管道写入可写流 reader.pipe(upStream); return ctx.body = "上传成功!"; }) // 上传多个文件 router.post('/uploadfiles', async (ctx, next) => { // 获取上传文件 // 新版本的koa-body通过ctx.request.files获取上传的文件 // 旧版本的koa-body通过ctx.request.body.files获取上传的文件 const files = ctx.request.files.file; // 获取上传文件 for (let file of files) { // 创建可读流 const reader = fs.createReadStream(file.path); // 获取上传文件扩展名 let filePath = path.join(__dirname, '/upload/') + `/${file.name}`; // 创建可写流 const upStream = fs.createWriteStream(filePath); // 可读流通过管道写入可写流 reader.pipe(upStream); } return ctx.body = "上传成功!"; }); // pots请求,参数解析插件 app.use(bodyParser()); // 引入路由插件 app.use(router.routes()); app.listen(3000); console.log('app started at port 3000...');

  参考链接:https://www.jianshu.com/p/34d0e1a5ac70

你可能感兴趣的:(NodeJS)