提前安装好三个包
-
npm i multer (文件上传相关) -
npm i multer @types/multer -D (使用multer的语法提示) -
npm i compressing (文件压缩)
新建一个upload相关的资源
- nest g res upload
文件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 { diskStorage } from 'multer';
import { extname, join } from 'path';
@Module({
imports:[MulterModule.register({
// 配置存放位置
storage:diskStorage({
destination:join(__dirname,'../images'),
filename:(_,file,callback)=>{
const fileName = `${new Date().getTime()+ extname(file.originalname)}`
return callback(null,fileName)
}
})
})],
controllers: [UploadController],
providers: [UploadService]
})
export class UploadModule {}
文件upload.controller.ts
import {
Controller,
Get,
Post,
Body,
Patch,
Param,
Delete,
UseInterceptors,
UploadedFile,
UploadedFiles,
Res,
} from '@nestjs/common';
import { UploadService } from './upload.service';
import { CreateUploadDto } from './dto/create-upload.dto';
import { UpdateUploadDto } from './dto/update-upload.dto';
import { FileInterceptor } from '@nestjs/platform-express';
import { join } from 'path';
import type { Response } from 'express';
import { zip } from 'compressing';
@Controller('upload')
export class UploadController {
constructor(private readonly uploadService: UploadService) {}
@Post('album')
@UseInterceptors(FileInterceptor('file'))
upload(@UploadedFile() file) {
//上传多文件使用UploadedFiles
console.log('file', file);
return 'ff';
}
// 文件下载
// 方式1:直接下载
@Get('export')
dowmLoda(@Res() res: Response) {
const url = join(__dirname, '../images/1668133646860.jpg');
res.download(url);
}
// 方式2:流的形式下载,下载完后的文件时二进制的形式,需要前端配合才能看(详看文件下载)
@Get('stream')
async dowm(@Res() res: Response) {
const url = join(__dirname, '../images/1668133646860.jpg');
const tarStream = new zip.Stream()
await tarStream.addEntry(url)
res.setHeader('Content-Type','application/octet-stream')
res.setHeader('Content-Disposition','attachment;filename=pp')
tarStream.pipe(res)
}
}
文件main.ts(配置静态资源服务)
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as session from 'express-session';
import * as cors from 'cors'
import { VersioningType } from '@nestjs/common';
import {Request,Response,NextFunction} from 'express'
import { NestExpressApplication } from '@nestjs/platform-express';
import { join } from 'path';
async function bootstrap() {
const app = await NestFactory.create<NestExpressApplication>(AppModule);
// 配置静态资源访问(使用NestExpressApplication泛型才会可以语法提示)
app.useStaticAssets(join(__dirname,'images'),{
// prefix:'pp'//配置虚拟路径
})
await app.listen(3000);
}
bootstrap();