返回

从零搭建Koa,让文件上传不在是难题!

前端

使用 Koa 中间件实现文件上传

  1. 安装必要的依赖项

    首先,需要安装必要的依赖项。在项目中,使用以下命令安装 koakoa-routerkoa-bodyparser 中间件:

    npm install koa koa-router koa-bodyparser
    
  2. 创建 Koa 应用

    接下来,创建一个 Koa 应用。在项目根目录创建一个名为 app.js 的文件,并添加以下代码:

    const Koa = require('koa');
    const Router = require('koa-router');
    const bodyParser = require('koa-bodyparser');
    
    const app = new Koa();
    const router = new Router();
    
    // 使用 koa-bodyparser 中间件来解析请求体中的文件数据
    app.use(bodyParser());
    
    // 定义路由处理文件上传请求
    router.post('/upload', async (ctx) => {
      // 获取上传的文件
      const file = ctx.request.files.file;
    
      // 处理文件上传逻辑...
    });
    
    // 使用路由中间件
    app.use(router.routes());
    app.use(router.allowedMethods());
    
    // 启动 Koa 应用
    app.listen(3000);
    
  3. 处理文件大小限制

    默认情况下,Koa 没有文件大小限制。但是,如果需要限制文件大小,可以使用 koa-multer 中间件。首先,安装 koa-multer 中间件:

    npm install koa-multer
    

    然后,在 app.js 文件中,使用 koa-multer 中间件来限制文件大小:

    const multer = require('koa-multer');
    
    const storage = multer.diskStorage({
      destination: './uploads/',
      filename: (req, file, cb) => {
        cb(null, Date.now() + '-' + file.originalname);
      }
    });
    
    const upload = multer({ storage: storage });
    
    // 定义路由处理文件上传请求
    router.post('/upload', upload.single('file'), async (ctx) => {
      // 获取上传的文件
      const file = ctx.req.file;
    
      // 处理文件上传逻辑...
    });
    

    在上面的代码中,multer.diskStorage() 函数指定了文件存储的路径和文件名生成规则。upload.single('file') 函数表示只允许上传一个名为 file 的文件。

  4. 处理文件类型限制

    默认情况下,Koa 也没有文件类型限制。但是,如果需要限制文件类型,可以使用 koa-multer 中间件。在 app.js 文件中,使用 koa-multer 中间件来限制文件类型:

    const multer = require('koa-multer');
    
    const storage = multer.diskStorage({
      destination: './uploads/',
      filename: (req, file, cb) => {
        cb(null, Date.now() + '-' + file.originalname);
      }
    });
    
    // 限制文件类型为图片
    const fileFilter = (req, file, cb) => {
      if (file.mimetype.startsWith('image/')) {
        cb(null, true);
      } else {
        cb(null, false);
      }
    };
    
    const upload = multer({ storage: storage, fileFilter: fileFilter });
    
    // 定义路由处理文件上传请求
    router.post('/upload', upload.single('file'), async (ctx) => {
      // 获取上传的文件
      const file = ctx.req.file;
    
      // 处理文件上传逻辑...
    });
    

    在上面的代码中,fileFilter 函数指定了只允许上传图片文件。

  5. 处理文件重命名

    默认情况下,Koa 不会对上传的文件进行重命名。但是,如果需要对上传的文件进行重命名,可以使用 koa-multer 中间件。在 app.js 文件中,使用 koa-multer 中间件来对上传的文件进行重命名:

    const multer = require('koa-multer');
    
    const storage = multer.diskStorage({
      destination: './uploads/',
      filename: (req, file, cb) => {
        cb(null, Date.now() + '-' + file.originalname);
      }
    });
    
    // 自定义文件名生成规则
    const filename = (req, file, cb) => {
      cb(null, 'custom-' + Date.now() + '-' + file.originalname);
    };
    
    const upload = multer({ storage: storage, filename: filename });
    
    // 定义路由处理文件上传请求
    router.post('/upload', upload.single('file'), async (ctx) => {
      // 获取上传的文件
      const file = ctx.req.file;
    
      // 处理文件上传逻辑...
    });
    

    在上面的代码中,filename 函数指定了自定义的文件名生成规则。

  6. 处理文件存储路径

    默认情况下,Koa 会将上传的文件存储在系统临时目录中。但是,如果需要将上传的文件存储到自定义路径,可以使用 koa-multer 中间件。在 app.js 文件中,使用 koa-multer 中间件来指定自定义的文件存储路径:

    const multer = require('koa-multer');
    
    const storage = multer.diskStorage({
      destination: './uploads/',
      filename: (req, file, cb) => {
        cb(null, Date.now() + '-' + file.originalname);
      }
    });
    
    // 指定自定义的文件存储路径
    const dest = './custom-uploads/';
    
    const upload = multer({ storage: storage, dest: dest });
    
    // 定义路由处理文件上传请求
    router.post('/upload', upload.single('file'), async (ctx) => {
      // 获取上传的文件
      const file = ctx.req.file;
    
      // 处理文件上传逻辑...
    });
    

    在上面的代码中,dest 变量指定了自定义的文件存储路径。

  7. 处理图片上传

    图片上传是文件上传中最常见的一种类型。在 Koa 中,可以使用 koa-multer 中间件来处理图片上传。在 app.js 文件中,使用 koa-multer 中间件来处理图片上传:

    const multer = require('koa-multer');
    
    const storage = multer.diskStorage({
      destination: './uploads/',
      filename: (req, file, cb) => {
        cb(null, Date.now() + '-' + file.originalname);
      }
    });
    
    // 限制文件类型为图片
    const fileFilter = (req, file, cb) => {
      if (file.mimetype.startsWith('image/')) {
        cb(null, true);
      } else {
        cb(null, false);
      }
    };
    
    const upload = multer({ storage: storage, fileFilter: fileFilter });
    
    // 定义路由处理图片上传请求
    router.post('/upload-image', upload.single('image'), async (ctx) => {
      // 获取上传的图片文件
      const image = ctx.req.file;
    
      // 处理图片上传逻辑...
    });
    

    在上面的代码中,upload.single('image') 函数指定了只允许上传一个名为 image 的图片文件。fileFilter 函数指定了只允许上传图片文件。

  8. 处理视频上传

    视频上传也是文件上传中最常见的一种类型。在 Koa 中,可以使用 koa-multer 中间件来处理视频上传。在 app.js 文件中,使用 koa-multer 中间件来处理视频上传:

    const multer = require('koa-multer');
    
    const storage = multer.diskStorage({
      destination: './uploads/',
      filename: (req, file, cb) => {
        cb(null, Date.now() + '-' + file.originalname);
      }
    });
    
    // 限制文件类型为视频
    const fileFilter = (req, file, cb) => {
      if (file.mimetype.startsWith('video/')) {
        cb(null, true);