如何使用NestJS+TypeORM将文件上传存储到PostgreSQL数据库
所需调整步骤
- 安装依赖(如果未安装)
NestJS默认依赖@nestjs/platform-express已经包含文件上传所需的multer封装,无需额外安装第三方包。如果你的项目是自定义适配器,可单独安装@types/multer获得类型提示:
npm i -D @types/multer
- 调整实体类(可选但推荐)
补充文件名、文件MIME类型字段,方便后续下载文件时返回正确的响应头:
// 在Certificate实体中新增两个字段 @ApiProperty() @Column({ type: 'varchar', length: 200, nullable: true }) fileName: string; @ApiProperty() @Column({ type: 'varchar', length: 100, nullable: true }) fileType: string; // 原有attachFile字段保留即可 @ApiProperty() @Column({ type: 'bytea' }) attachFile: Uint8Array;
- 修改控制器逻辑
原控制器仅支持JSON格式请求,文件上传需要使用multipart/form-data格式,需引入文件拦截器处理上传的文件:
import { Controller, Post, Body, UseInterceptors, UploadedFile } from '@nestjs/common'; import { FileInterceptor } from '@nestjs/platform-express'; @Post() @UseInterceptors(FileInterceptor('attachFile')) // 这里的attachFile对应前端form-data里的文件字段名 create( @Body() createCertificateDto: CreateCertificateDto, @UploadedFile() file: Express.Multer.File ): Promise<Certificate> { // 将文件的二进制内容、文件名、文件类型合并到DTO中 const payload = { ...createCertificateDto, attachFile: file.buffer, // multer拿到的file.buffer直接是Uint8Array格式,匹配实体字段类型 fileName: file.originalname, fileType: file.mimetype }; return this.certificatesService.create(payload); }
- 调整DTO定义
在CreateCertificateDto中移除attachFile字段的前端校验规则,该字段由后端赋值,无需前端传递:
// CreateCertificateDto示例 export class CreateCertificateDto { // 原有其他字段的校验规则保留 statusOfReport: string; sponser: string; // ... 其他字段都保持不变 // 去掉attachFile字段的定义,或者标记为可选且不需要前端传递 }
- 大文件优化提示(可选)
如果需要上传超过10MB的文件,可以在主模块中调整multer的文件大小限制:
// 在main.ts中配置全局body解析限制 app.useBodyParser('json', { limit: '50mb' }); app.useBodyParser('urlencoded', { extended: true, limit: '50mb' }); // 或者在FileInterceptor中单独配置大小限制 @UseInterceptors(FileInterceptor('attachFile', { limits: { fileSize: 50 * 1024 * 1024 } // 限制最大50MB }))
验证方式
调用接口时选择multipart/form-data格式请求:
- 普通字段直接填对应文本值
attachFile字段选择本地文件上传即可
内容的提问来源于stack exchange,提问作者Shruti sharma
相关产品推荐
相关产品推荐

