当前位置: 首页 > 工具软件 > ng-nest > 使用案例 >

nest学习:文件上传和下载

谭翰海
2023-12-01

文章问题导向

nest如何文件上传?

如果你都有了答案,可以忽略本文章,或去nest学习导图寻找更多答案


注意

该文章只是单文件,小文件上传

下载文件的两种方式

第一种:后端压缩好文件,由前端下载
第二种:基于流的方式,向前端发送内容

本文是基于流的方式


第一步:安装

yarn add @nestjs/platform-express compressing
@nestjs/platform-express 平台依赖
compressing 文件下载依赖,提供流的方式

第二步:配置

src → config → file

配置文件的目录地址,以及文件的名字格式

import { join } from 'path';
import { diskStorage } from 'multer';

export default {
  root: join(__dirname, '../uploads'),
  storage: diskStorage({
    destination: join(__dirname, `../uploads/${new Date().toLocaleDateString()}`),
    filename: (req, file, cb) => {
      const filename = `${new Date().getTime()}.${file.mimetype.split('/')[1]}`;
      return cb(null, filename);
    },
  }),
};

第三步:编写代码
src -> module -> album

album.module.ts

import { Module } from '@nestjs/common';
import { MulterModule } from '@nestjs/platform-express';
import { ConfigService } from 'nestjs-config';
import { AlbumController } from './album.controller';
import { AlbumService } from './album.service';

@Module({
  imports: [
    MulterModule.registerAsync({
      useFactory: (config: ConfigService) => config.get('file'),
      inject: [ConfigService],
    }),
  ],
  controllers: [AlbumController],
  providers: [AlbumService],
})
export class AlbumModule {}

album.controller.ts

import {
    Controller,
    Post,
    UploadedFile,
    UseInterceptors,
    Get,
    Res,
  } from '@nestjs/common';
  import { Response } from 'express';
  import { FileInterceptor } from '@nestjs/platform-express';
  import { AlbumService } from './album.service';
  
  @Controller('album')
  export class AlbumController {
    constructor(private readonly albumService: AlbumService) {}
  
  	文件上传
    @Post()
    @UseInterceptors(FileInterceptor('file'))  获取header的file文件
    upload(@UploadedFile() file) {             从UploadedFile可获取
      this.albumService.upload(file);
      return true;
    }
  
  	文件下载
    @Get('export')
    async downloadAll(@Res() res: Response) {
      
      基于流的下载方式
      const { filename, tarStream } = await this.albumService.downloadAll();
      设置响应to
      
      res.setHeader('Content-Type', 'application/octet-stream');
      res.setHeader(
        'Content-Disposition',  
        `attachment; filename=${filename}`,
      );
      tarStream.pipe(res);  流转换到res响应
    }
  }

album.service.ts

compressing支持多种压缩方式

import { Injectable } from '@nestjs/common';
import { zip } from 'compressing';   
import { ConfigService } from 'nestjs-config';

@Injectable()
export class AlbumService {
  constructor(private readonly configService: ConfigService) {}

  upload(file) {
    console.log(file);
  }

  async downloadAll() {
    const uploadDir = this.configService.get('file').root;
    const tarStream = new zip.Stream();  文件压缩流
    await tarStream.addEntry(uploadDir); 压缩文件路径
    return { filename: 'hello-world.zip', tarStream };
  }
}

学习更多

nest学习导图

 类似资料: