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());
}
})
}),
});
提供一套完美的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;