Nest ( 上传 下载 )

61 阅读1分钟
上传
yarn add multer -S
yarn add @types/multer -D
nest g res upload

image.png

依赖两个插件

@nestjs/platform-express Nestjs内置的插件

multer 需要下载

/**
    diskStorage内方法  接收三个参数  req,file,callback
    destination:静态目录 
    filename 文件的处理
*/
 storage:diskStorage({
    destination:join(__dirname,'../images'),
    filename:(_,file,cb)=>{
      console.log("upload Moudle",file)
      return cb(null, file.originalname)
    }
  })
upload.module.ts
import { Module } from '@nestjs/common';
import { UploadService } from './upload.service';
import { UploadController } from './upload.controller';
import { MulterModule } from '@nestjs/platform-express'
import { extname,join } from 'path'
import { diskStorage } from 'multer'

@Module({
  imports:[
    MulterModule.register({
      storage:diskStorage({
        destination:join(__dirname,'../images'),
        filename:(_,file,cb)=>{
          console.log("upload Moudle",file)
          return cb(null, file.originalname)
        }
      })
    })
  ],
  controllers: [UploadController],
  providers: [UploadService]
})
export class UploadModule {}

upload.controller.ts

UseInterceptors拦截器

FileInterceptor参数

  • fileName: 提供保存文件的 HTML 表单中的字段名称的字符串

  • options: 类型的可选对象,与 multer 构造函数使用的对象相同,主要可以配置上传文件的大小之类的

@UseInterceptors(FileInterceptor('file', {
    limits: { fileSize: Math.pow(1024, 2) * 2 },
    fileFilter(req: any, file: Express.Multer.File, callback: (error: Error | null, acceptFile: boolean) => void) {
      if (!file.mimetype.includes('image')) {
        callback(new MethodNotAllowedException('类型不支持'), false)
      } else {
        callback(null, true)
      }
    }
  }))
import { Controller, Get, Post, Body, Patch, Param, Delete,UploadedFile,UseInterceptors } from '@nestjs/common';
import { UploadService } from './upload.service';
import { CreateUploadDto } from './dto/create-upload.dto';
import { UpdateUploadDto } from './dto/update-upload.dto';
import { FileInterceptor,FilesInterceptor } from '@nestjs/platform-express'

@Controller('upload')
export class UploadController {
  constructor(private readonly uploadService: UploadService) {}

  @Post('img')
  @UseInterceptors(FileInterceptor('file'))
  uploadImg(@UploadedFile() file){
    console.log(file)
    return {
      code:200,
      message:'ok'
    }
  }
}


打印file

image.png

ApiFox模拟

image.png

上传成功

image.png

这个时候直接访问 是访问不到的

image.png

需要在main.ts配置 静态访问路径

import { NestExpressApplication } from '@nestjs/platform-express'
import { join } from 'path';
const app = await NestFactory.create<NestExpressApplication>(AppModule)

app.useStaticAssets(join(__dirname,'images'))
完美

image.png

下载
  • 直接下载

先采用直接下载 后期链接数据库

 @Get('export')
  exportImage(@Response() res, @Query() query){
    // 逻辑...
    const baseUrl = join(__dirname,'../images/'+query.url)
    res.download(baseUrl)
  }

image.png