上传文件接口实现
通过拦截器拦截文件,并通过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 {}