我正在开发一个应用程序,用户可以在其中上传多个文件,然后将这些文件作为附件添加到电子邮件中。我可以使用多个选项限制每个文件的文件大小。但是我不能为字段总数设置限制。
限制文件总大小的最佳做法是什么?
这是我解析传入文件的方式:
@Post('send')
@UseInterceptors(
AnyFilesInterceptor({ limits: { fileSize: 2 \* 1024 \* 1024 } }),
)
sendEmailWithAttachment(
@Body() sendEmailPayload: SendEmailPayload,
@UploadedFiles() files: Array\<Express.Multer.File\>,
) {
出于演示目的,我添加了 2mb 限制。
我可以写一个服务级别的函数来检查文件大小的总和,但它似乎不太可行。
您可以使用 Nest Guard 来执行此逻辑,例如:
@Injectable()
export class FileSizeGuard implements CanActivate {
constructor(private readonly maxTotalSize: number) {}
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
const request = context.switchToHttp().getRequest();
const files: Express.Multer.File[] = request.files;
const totalSize = files.reduce((acc, file) => acc + file.size, 0);
if (totalSize > this.maxTotalSize) {
return false;
}
return true;
}
}
然后在你的控制器端点上使用这个守卫:
@Post('send')
@UseGuards(new FileSizeGuard(10 * 1024 * 1024)) // limit total size to 10MB
...