在 Nest 框架内部会使用 Multer,提供文件上传的功能。下面再安装一下这个 Multer 的类型定义,在终端,项目所在目录的下面,执行 npm install 安装 @types/multer,把它保存在项目的开发依赖里。
再创建一个文件上传模块,执行一下 nest generate module 生成一个模块,名字是 app-upload,放在 app/modules/upload 目录的下面,加个 --flat 选项。
准备配置
回到项目,先准备一个配置,找到 .env 文件,在里面定义一个表示保存文件上传目录的环境变量,UPLOAD_DEST,值是 uploads 。
在 app/modules/upload 里面,新建一个配置文件,放在 configs 里面,名字是 app-upload.config.ts,文件里默认导出一个函数,函数返回一个对象,里面添加一个 upload,它是一个对象,里面有个 dest,表示保存上传文件的地方,它的值是 process.env.UPLOAD_DEST 这个环境变量的值。
上传模块
打开 AppUploadModule 模块,在文件顶部先导入需要用的配置,appUploadConfig 来自当前目录 configs 下面的 app-upload.config 。
在模块里面添加一个 imports ,导入一个 ConfigModule 用一下 forFeature ,把 appUploadConfig 交给它。
下面再配置一下 MulterModule ,用一下 registerAsync ,提供一个对象,里面用 inject 注入一个依赖,需要的是 ConfigService,然后用 useFactory ,提供一个函数,有个 configService 参数,类型是 ConfigService,方法返回一个配置对象,里面添加一个 dest ,它的值就是默认的保存上传文件的地方,这里用一下 configService.get 得到 upload.dest 这个配置的值。
在模块里再添加一个 exports ,在导出这里导出 MulterModule 。
配置
再修改几个配置,先打开 tsconfig.build.json 这个文件,在这个 exclude 里面,添加一个 'uploads' ,这样在编译应用的时候会忽略掉 uploads 这个目录,因为这个目录里存储的东西是从客户端那里上传过来的文件,不需要编译。
然后再打开 .gitignore ,在这个文件里添加一个 uploads ,这样在做源代码管理的时候,会忽略掉 uploads 目录。