nest学习摘要(4)

32 阅读1分钟

上传%&下载

// NestJS核心装饰器和接口
import { Controller, Get, Post, Body, Patch, Param, Delete, UseInterceptors, UploadedFile, 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, FilesInterceptor } from '@nestjs/platform-express';
// Express响应类型
import type { Response } from "express"
// 路径处理工具
import { join } from 'path'
// 压缩库
import { zip } from 'compressing';
/**
 * 文件上传控制器
 * 处理文件上传、下载和压缩下载功能
 */
@Controller('upload')
export class UploadController {
  constructor(private readonly uploadService: UploadService) { }

  /**
   * 文件上传接口
   * @UseInterceptors 使用拦截器装饰器,用于处理文件上传
   * @FileInterceptor 文件拦截器,指定表单字段名为'file',处理单文件上传
   * @UploadedFile 上传文件装饰器,将上传的文件对象注入到参数中
   * @param file 上传的文件对象,包含文件名、大小、类型等信息
   * @returns 上传状态信息
   */
  @Post('album')
  @UseInterceptors(FileInterceptor('file')) // 使用文件拦截器处理名为'file'的表单字段
  upload(@UploadedFile() file) { // 注入上传的文件对象
    console.log(file, 'FILE');
    return '在坚持一下'
  }
  /**
   * 文件下载接口
   * 直接下载指定的图片文件
   * @param res Express响应对象
   * @returns 下载状态信息
   */
  @Get('export')
  download(@Res() res: Response) {
    const downloadUrl = join(__dirname, '../images/1758202235857.png')
    res.download(downloadUrl)
    return '下载成功!'
  }
  /**
   * 流式压缩下载接口
   * 将文件压缩为zip格式后通过流的方式下载
   * @param res Express响应对象
   */
  @Get('stream')
  async down(@Res() res: Response) {
    // 获取要下载的文件路径
    const downloadUrl = join(__dirname, '../images/1758202235857.png')

    // 创建zip压缩流
    const StrZip = new zip.Stream()

    // 将文件添加到压缩流中
    await StrZip.addEntry(downloadUrl)

    // 设置响应头,指定文件类型为二进制流
    res.setHeader('Content-Type', 'application/octet-stream')

    // 设置响应头,指定下载文件名
    res.setHeader('Content-Disposition', 'attachment; filename=testFile')

    // 将压缩流管道输出到响应对象
    StrZip.pipe(res)
  }

}