nest上传文件,文件下载,静态资源服务

750 阅读1分钟

提前安装好三个包

  • 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();