前言
使用了 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());}})}),
});
