NestJS实现图片上传与静态资源服务

2,684 阅读1分钟

静态资源服务

docs.nestjs.com/recipes/ser…

zhuanlan.zhihu.com/p/369645693

让nestjs项目提供静态文件,主要参照以上两个文档

有很多博客使用import { NestExpressApplication } from '@nestjs/platform-express',但这个没有试验成功,这些博客有可能过时了。

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ServeStaticModule } from '@nestjs/serve-static';
import { join } from 'path';
​
@Module({
  imports: [
    ServeStaticModule.forRoot({
      rootPath: join(__dirname, '..', 'public/uploaded'),
      serveRoot: '/static',
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
​

这样配置之后我们可以用http://localhost:3000/static/1673278326188.jpeg访问public/uploaded文件夹下的图片。

图片上传

docs.nestjs.com/techniques/…

主要参照官方文档实现

步骤一:新建Upload模块

// upload.module.ts
import { Module } from '@nestjs/common';
import { MulterModule } from '@nestjs/platform-express';
import { diskStorage } from 'multer';
import { extname, join } from 'path';
import { UploadController } from './upload.controller';
import { UploadService } from './upload.service';
​
@Module({
  imports: [
    MulterModule.register({
      // 用于配置上传,这部分也可以写在路由上
      storage: diskStorage({
        // destination: join(__dirname, '../images'),
        destination: join('./public/uploaded'),
        filename: (_, file, callback) => {
          const fileName = `${
            new Date().getTime() + extname(file.originalname)
          }`;
          return callback(null, fileName);
        },
      }),
    }),
  ],
  controllers: [UploadController],
  providers: [UploadService],
})
export class UploadModule {}

步骤二:新建Upload路由

// upload.controller.ts
import {
  Controller,
  Post,
  UploadedFile,
  UseInterceptors,
} from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { UploadService } from './upload.service';
import { diskStorage } from 'multer';
import { extname } from 'path';
​
@Controller('upload')
export class UploadController {
  constructor(private readonly uploadService: UploadService) {}
​
  @Post('')
  // @UseInterceptors(
  //   FileInterceptor('file', {
  //     storage: diskStorage({
  //       destination: './public/uploaded',
  //       filename: (_, file, callback) => {
  //         const fileName = `${
  //           new Date().getTime() + extname(file.originalname)
  //         }`;
  //         return callback(null, fileName);
  //       },
  //     }),
  //   }),
  // )
  @UseInterceptors(FileInterceptor('file'))
  upload(@UploadedFile() file: Express.Multer.File) {
    console.log('upload', file);
    // return this.uploadService.upload();
    return file;
  }
}

当前写的比较简单,UploadService没有使用,就不贴上来了。

步骤三:引入upload模块

// app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ServeStaticModule } from '@nestjs/serve-static';
import { extname, join } from 'path';
import { UploadModule } from './upload/upload.module';
import { MulterModule } from '@nestjs/platform-express';
import { diskStorage } from 'multer';
​
@Module({
  imports: [
    ServeStaticModule.forRoot({
      rootPath: join(__dirname, '..', 'public/uploaded'),
      serveRoot: '/static',
    }),
    UploadModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
​

如此依赖,我们就可以完成图片内容的上传。利用Postman测试,因为multer只能处理multipart/form-data,因而此处需要选择form-data,记得勾选左侧对勾。

截屏2023-01-09 23.50.31