在nestjs中,当body验证失败时,如何防止文件上传



在nestjs应用程序中上传文件之前,我有要验证的多部分表单。问题是,如果body验证失败,我不希望上传文件。以下是我为编写代码的方式。

// User controller method for create user with upload image
@Post()
@UseInterceptors(FileInterceptor('image'))
create(
@Body() userInput: CreateUserDto,
@UploadedFile(
new ParseFilePipe({
validators: [
// some validator here
]
})
) image: Express.Multer.File,
) {
return this.userService.create({ ...userInput, image: image.path });
}

尝试了很多方法来解决这个问题,但没有找到任何解决方案

拦截器在管道之前运行,因此除非您自己在服务中管理,否则无法使文件的保存不发生。然而,另一个选项可以是自定义异常过滤器,unlink会在文件出错时对其进行过滤,这样您就不必担心它在上传后

这就是我创建整个过滤器的方式

import { isArray } from 'lodash';
import {
ExceptionFilter,
Catch,
ArgumentsHost,
BadRequestException,
} from '@nestjs/common';
import { Request, Response } from 'express';
import * as fs from 'fs';
@Catch(BadRequestException)
export class DeleteFileOnErrorFilter implements ExceptionFilter {
catch(exception: BadRequestException, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>();
const request = ctx.getRequest<Request>();
const status = exception.getStatus();
const getFiles = (files: Express.Multer.File[] | unknown | undefined) => {
if (!files) return [];
if (isArray(files)) return files;
return Object.values(files);
};
const filePaths = getFiles(request.files);
for (const file of filePaths) {
fs.unlink(file.path, (err) => {
if (err) {
console.error(err);
return err;
}
});
}
response.status(status).json(exception.getResponse());
}
}

相关内容

  • 没有找到相关文章

最新更新