tsoa 上传文件

前言

使用了 tsoa 之后,路由参数交互就不再使用 koaBody,那 koaBody 接收文件上传的那一套自然也不会再可行了。

安装multer

tsoa 上传文件底层用的是 multer, 这里参考官方教程.

npm install @koa/multer multer 

这样你就可以直接在项目中使用了(需要注意的是 如果还有其他字段 请以表单方式接受)

import { Post, Route, FormField, UploadedFile } from "tsoa";

@Route("some")
export class SomeController {
  @Post("uploadFile")
  public async uploadFile(@FormField() title: string, @UploadedFile() file: File): Promise<void> {
    console.log(files);
  }
}

默认情况下,文件存储在操作系统的临时文件夹内!

自定义上传路径

其实这个简单,在很在之前就有人提过这个问题 issue,可以直接在 tsoa.json 中定义 multer配置项目

{
 "multerOpts": {
      "dest": "./uploads",
  }
}

这样文件就会传递到你指定的目录了。

修改文件属性

比如修改上传的文件名等等,按理说 tsoa.json>multerOpts 是可以直接 storage字段的。通过此字段可以操作 file 任何属性。
可惜受限于配置文件只能是 json,所以storage字段的可配置性基本作废。

捣鼓了半天后,也没解决! 最后通过不断的搜索、死磕,最终找到一个 issue 说 其实官方支持另一种方式来定义multerOpts,但是官方文档却没有提及!
气的我在后边回复 issue 大骂了一句 fc!

// app.ts
import multer from '@koa/multer';
import { RegisterRoutes } from '@/routers/routes';

RegisterRoutes(router, {
  multer: multer({
    // limits: {
    //   fieldNameSize: 120,
    // },
    storage: multer.diskStorage({
      destination: function (req, file, cb) {
        cb(null, path.join(__dirname,'uploads'));
      },
      filename: function (req, file, cb) {
        cb(null, file.fieldname + '-' + Date.now());
      }
    })
  }),
});

image

提供一套完美的multer配置

multer-config.ts

import fs from 'fs';
import os from 'os';
import path from 'path';
import dayjs from 'dayjs';
import multer from '@koa/multer';

// 创建上传目录(最好不要配置到项目中,否则会跟随代码部署而被清空)
const uploadDir = path.join(os.tmpdir(), 'git-drive-api-uploads'); // 系统临时目录(跨平台兼容)
if (!fs.existsSync(uploadDir)) {
  fs.mkdirSync(uploadDir, { recursive: true });
}

const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, uploadDir);
  },
  filename: function (req, file, cb) {
    const ext = path.extname(file.originalname);
    const baseName = path.basename(file.originalname, ext);
    cb(null, baseName + '-' + dayjs().format('YYYYMMDDHHmmss') + ext);
  },
});

const multerConfig = multer({ storage });

// 导出 storage 实例供 TSOA 使用
export default multerConfig;
posted @ 2025-08-20 16:28  丁少华  阅读(11)  评论(0)    收藏  举报