Multer 的配置选项里可以提供一个 fileFilter,它是一个回调,在这个回调里你可以根据一些条件判断到底是否要上传文件,比如可以设置一下允许上传的文件类型,如果上传的文件不属于允许的类型,可以忽略掉这个文件,或者报错。
打开 FileModule, 在给 MulterModule 的 register 方法提供的配置对象里面,再添加一个 fileFilter,它的值是一个函数, 用一个箭头函数,函数有几个参数,req,表示请求,file 是上传的文件,还有一个 callback 。
在这个方法里先添加一个 mimetypes,它的值可以是一组允许上传的文件类型, 比如添加一个 image/png, 再添加一个 image/jpg 。
下面再添加一个 allowed,用一下 mimetypes 这个数组的 some 方法,提供给它一个测试用的回调,当前项目叫 type, return 的是 判断一下 type 的值是不是等于 file 这个参数里的 mimetype。
意思就是看看要上传的文件的 mimetype 在不在这个允许的类型列表里面,如果在,allowed 的值就会是 true,不然它的值就会是 false。
有了结果以后可以做一下判断, 如果 allowed, 我们就执行一下 callback,第一个参数是错误,没有就用一个 null, 允许上传, callback 的第二个参数要设置成 true,不允许就把它设置成 false。
再添加一个 else,如果上传的文件的类型不在允许的类型列表里, 执行一下 callback,给它一个异常,新建一个 BadRequestException, 设置一下异常信息,不支持上传此类型的文件,然后把第二个参数设置成 false,这样就不会上传文件 ..
测试
打开 Http 客户端,可以测试一下, 发送一下这个上传文件的请求, 可以成功上传文件,因为要上传的文件的类型在允许的类型列表里。
选择一个其它类型的文件,比如这个 md 文件,选择, 发送一下这个请求,这回得到了一个 400 的响应,提示不支持上传此类型的文件。
因为要上传的是一个 text/markdow 类型的文件, 它不在允许上传的文件类型列表里,所以就会得到这个 400 状态的响应。