📜  Koa.js-文件上传(1)

📅  最后修改于: 2023-12-03 15:17:09.002000             🧑  作者: Mango

Koa.js 文件上传

Koa.js 是一个基于 Node.js 的 web 开发框架,它的设计理念非常简单,中间件机制让它的扩展性非常强,让开发者不用关注 http 协议的底层细节就可以构建 web 应用。Koa.js 内置了对文件上传的支持,通过 koa-body 中间件和 koa-multer 中间件实现。

安装

要使用 Koa.js 支持文件上传功能,需要安装 koa-body 和 koa-multer 两个中间件。

npm install koa-body koa-multer --save
使用
koa-body 中间件

koa-body 中间件是 Koa.js 官方提供的一个解析请求体的中间件,支持 application/json、application/x-www-form-urlencoded 和 multipart/form-data 三种请求格式。其中,multipart/form-data 格式用于上传文件。

安装好 koa-body 中间件后,在 Koa.js 应用中引用 koa-body,即可使用 ctx.request.body 获取请求体中的参数和文件信息。

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

const app = new Koa();
app.use(koaBody({
  multipart: true  // 支持文件上传
}));

app.use(async (ctx) => {
  const params = ctx.request.body;
  console.log(params);
  // { username: 'xiaoming', avatar: { name: 'avatar.jpg', path: '/path/to/avatar.jpg' } }

  ctx.body = 'Hello world!';
});

app.listen(3000);
koa-multer 中间件

koa-multer 中间件是一个专门用于文件上传的中间件,它基于 multer 库实现。与 koa-body 中间件相比,koa-multer 中间件更为强大,可以自定义上传的文件名、存储路径等信息。

安装好 koa-multer 中间件后,在 Koa.js 应用中引用 koa-multer,即可使用 ctx.req.file 和 ctx.req.files 获取上传的文件信息。

const Koa = require('koa');
const Router = require('koa-router');
const multer = require('@koa/multer');

const app = new Koa();
const router = new Router();

const upload = multer({
  storage: multer.diskStorage({
    destination: function (req, file, cb) {
      // 指定上传文件的存储路径
      cb(null, '/path/to/uploads');
    },
    filename: function (req, file, cb) {
      // 指定上传文件的文件名
      cb(null, file.fieldname + '-' + Date.now());
    }
  })
});

router.post('/upload', upload.single('avatar'), async (ctx) => {
  const file = ctx.req.file;
  console.log(file);
  // { fieldname: 'avatar',
  //   originalname: 'avatar.jpg',
  //   encoding: '7bit',
  //   mimetype: 'image/jpeg',
  //   destination: '/path/to/uploads',
  //   filename: 'avatar-1588700526764',
  //   path: '/path/to/uploads/avatar-1588700526764',
  //   size: 158728 }

  ctx.body = 'Upload success!';
});

app.use(router.routes());
app.listen(3000);

通过上传图片的例子,可以看到 koa-multer 中间件自定义了文件的存储路径和文件名,并且在上传后将上传成功的信息返回给客户端。

总之,无论是使用 koa-body 中间件还是 koa-multer 中间件,都可以轻松地实现文件上传功能。选择哪个中间件,取决于项目需求和个人喜好。