上传
yarn add multer -S
yarn add @types/multer -D
nest g res upload
依赖两个插件
@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
ApiFox模拟
上传成功
这个时候直接访问 是访问不到的
需要在main.ts配置 静态访问路径
import { NestExpressApplication } from '@nestjs/platform-express'
import { join } from 'path';
const app = await NestFactory.create<NestExpressApplication>(AppModule)
app.useStaticAssets(join(__dirname,'images'))
完美
下载
- 直接下载
- 流
先采用直接下载 后期链接数据库
@Get('export')
exportImage(@Response() res, @Query() query){
// 逻辑...
const baseUrl = join(__dirname,'../images/'+query.url)
res.download(baseUrl)
}