当前位置: 首页 > article >正文

【Nest】文件下载——普通下载和流式下载

普通下载

直接对服务端中的某个路径进行响应下载。

import {
  Controller,
  Get,
  Post,
  Res,
  UploadedFile,
  UseInterceptors,
} from '@nestjs/common';
import { UploadService } from './upload.service';
import { FileInterceptor } from '@nestjs/platform-express';
import type { Response } from 'express';
import { join } from 'node:path';
import { zip } from 'compressing';

@Controller('upload')
export class UploadController {
  constructor(private readonly uploadService: UploadService) {}

  @Post('album')
  @UseInterceptors(FileInterceptor('file')) // file 为前端表单字段名
  uploadFile(@UploadedFile() file: Express.Multer.File) {
    console.log(file);
    return {
      localPath: file.path,
      onlinePath: 'http://localhost:3000/images/' + file.filename,
    };
  }

  @Get('export')
  downloadFile(@Res() res: Response) {
    const url = join(__dirname, '../images/file-1741220280567-926338688.jpg');
    res.download(url);
  }
}

前端

<template>
  <div>
    <el-button @click="downloadFile">下载</el-button>
  </div>
</template>
<script setup lang="ts">
const downloadFile = () => {
  //   普通下载
  window.open('/api/upload/export')
}
</script>

流式下载

import {
  Controller,
  Get,
  Post,
  Res,
  UploadedFile,
  UseInterceptors,
} from '@nestjs/common';
import { UploadService } from './upload.service';
import { FileInterceptor } from '@nestjs/platform-express';
import type { Response } from 'express';
import { join } from 'node:path';
import { zip } from 'compressing';

@Controller('upload')
export class UploadController {
  constructor(private readonly uploadService: UploadService) {}

  @Post('album')
  @UseInterceptors(FileInterceptor('file')) // file 为前端表单字段名
  uploadFile(@UploadedFile() file: Express.Multer.File) {
    console.log(file);
    return {
      localPath: file.path,
      onlinePath: 'http://localhost:3000/images/' + file.filename,
    };
  }

  @Get('export')
  downloadFile(@Res() res: Response) {
    const url = join(__dirname, '../images/file-1741220280567-926338688.jpg');
    res.download(url);
  }

  @Get('stream')
  async downloadFileStream(@Res() res: Response) {
    const url = join(__dirname, '../images/file-1741220280567-926338688.jpg');
    const tarStream = new zip.Stream();
    await tarStream.addEntry(url);

    res.setHeader('Content-Type', 'application/octet-stream');
    res.setHeader('Content-Disposition', `attachment; filename=heo`);
    tarStream.pipe(res);
  }
}

前端

<template>
  <div>
    <el-button @click="downloadFile">下载</el-button>
  </div>
</template>
<script setup lang="ts">
/**
 * 使用 Fetch API 异步获取指定 URL 的二进制数据,并触发下载
 *
 * @param {string} url - 要获取数据的 URL 地址
 */
const useFetch = async (url: string) => {
  // 异步获取 URL 对应的二进制数据
  const res = await fetch(url).then(res => res.arrayBuffer())

  // 创建一个新的 <a> 元素
  const a = document.createElement('a')

  // 将获取到的二进制数据转换为 Blob 对象,并生成 URL
  a.href = URL.createObjectURL(new Blob([res]))

  // 设置下载的文件名
  a.download = 'heo.zip'

  // 触发 <a> 元素的点击事件,开始下载
  a.click()
}

const downloadFile = () => {
  //   流式下载
  useFetch('/api/upload/stream')
  //   普通下载
  // window.open('/api/upload/export')
}
</script>

在这里插入图片描述


http://www.kler.cn/a/577996.html

相关文章:

  • 从零开始训练小型语言模型之minimind
  • jQuery事件机制
  • 【橘子golang】从golang来谈闭包
  • Android WebSocket工具类:重连、心跳、消息队列一站式解决方案
  • 课题推荐——无人机在UWB环境下基于TOA/TDOA/AOA的室内定位与精度对比
  • ThinkPHP框架
  • 【够用就好008】开新坑自学esb32烧录进军物联网和嵌入式
  • PHP之常用函数
  • H5页面在移动端自动横屏
  • 开发环境搭建-03.后端环境搭建-使用Git进行版本控制
  • Leetcode 378-有序矩阵中第 K 小的元素
  • [从零开始学习JAVA ] 接口介绍
  • Unity UGUI下优化需要射线检测类的UI元素的一种方式
  • 【GPT入门】第9课 思维树概念与原理
  • 数据安全防线:备份文件的重要性与自动化实践
  • stm32——fft踩坑日记
  • ABB机器人Profinet或Ethernet/IP通讯的GSD/EDS文件获取方法
  • vue-cli3+vue2+elementUI+avue升级到vite+vue3+elementPlus+avue总结
  • Python MongoDB速成教程
  • 国产化板卡设计原理图:2330-基于FMC接口的JFM7K325T PCIeX4 3U PXIe接口卡