nestjs实现文件上传接口

57 阅读1分钟

上传文件接口实现

通过拦截器拦截文件,并通过UploadedFile获取文件拦截器的文件对象。

FileInterceptor接收两个参数

  • fieldName: 提供包含文件的 HTML 表单中的字段名称的字符串
  • options: MulterOptions 类型的可选对象。这与 multer 构造函数使用的对象相同 文档
import {
  Controller,
  HttpCode,
  Post,
  UploadedFile,
  UseInterceptors,
} from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { diskStorage } from 'multer';
import { BasicResult } from 'src/shared/vo/basic-result.vo';
import { v4 as uuidv4 } from 'uuid';
import * as path from 'path';

@Controller('upload')
export class UploadController {
  @Post()
  @HttpCode(200)
  @UseInterceptors(
    FileInterceptor('file', {
      storage: diskStorage({
        destination: './uploads',
        filename: (req, file, callback) => {
          const filename = uuidv4() + path.extname(file.originalname);
          callback(null, filename);
        },
      }),
    }),
  )
  async upload(@UploadedFile() file: Express.Multer.File) {
    return BasicResult.success('图片上传成功', {
      ...file,
      url: `http://localhost:3000/uploads/${file.filename}`,
    });
  }
}

访问静态文件

通过 @nestjs/serve-static 模块可以直接指定静态文件目录。

import { Module } from '@nestjs/common';
import { UploadController } from './controllers/upload.controller';
import { join } from 'path';
import { ServeStaticModule } from '@nestjs/serve-static';

@Module({
  imports: [
    ServeStaticModule.forRoot({
      rootPath: join(__dirname, '../..', 'uploads'),
      serveRoot: '/uploads',
    }),
  ],
  controllers: [UploadController],
  providers: [],
})
export class CommonModule {}