14_文件下载&文件流

简介: 14_文件下载&文件流

之前讲了上传文件,本节我们来讨论下如何下载文件。为了方便讲解,我们使用nest g res download新建一组服务

  1. 第一种方式,直接在controller里调用res的download方法,简单粗暴
import { join } from 'path'
@Controller('download')
export class DownloadController {
  constructor(private readonly downloadService: DownloadService) {}
  @Get()
  getFile(@Req() req: Request, @Res() res: Response) {
  // 设置图片资源路径
    const url = join(__dirname, '..', 'image', '1680774602139.jpg');
  // 下载图片
    res.download(url);
  }
}

res.download接收一个URL,指向服务器中资源的地址。此时在前端访问localhost/download即可直接下载文件

  1. 以字节流的方式传输

本例中我们使用zip压缩一下,借助compressing模块实现

import { join } from 'path';
import { zip } from 'compressing';
@Get('stream')
  async getFileStream(@Req() req: Request, @Res() res: Response) {
    // 设置图片路径
    const url = join(__dirname, '..', 'image', '1680778329068.jpg');
    // 通过zip.Stream创建一个压缩文件流
    const tarStream = new zip.Stream();
    // 将图片资源加入流中
    await tarStream.addEntry(url);
    // 设置请求头信息,字节流对应的MIME类型为application/octet-stream
    res.setHeader('Content-Type', 'application/octet-stream');
    // 固定格式,提示浏览器打开文件下载对话框,filename即是对话框中文件的名字
    res.setHeader('Content-Disposition', `attachment;filename=xiaoman`);
    // 用管道连接文件流和响应流
    tarStream.pipe(res)
  }

启动服务,此时我们在浏览器中访问localhost/download/stream时浏览器就会自动下载二进制格式的文件,但是下载的文件并不能直接打开,需要在前端进行解析

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <button>下载</button>
  </body>
  <script>
    let btn = document.querySelector('button')
    btn.onclick = async () => {
      url = 'http://localhost:3000/download/stream'
      // 请求url,将返回的内容设置为arrayBuffer
      const response = await fetch(url).then((res) => res.arrayBuffer())
      // 使用arrayBuffer创建一个blob
      let blob = new Blob([response])
      // 生成指向blob的唯一URL地址
      let Url = URL.createObjectURL(blob)
      // 创建a标签并点击下载
      let a = document.createElement('a')
      a.href = Url
      a.download = '小满.zip'
      a.click()
    }
  </script>
</html>

以上,下载的文件会被保存成"小满.zip"

目录
相关文章
|
2月前
|
安全 C# 开发者
C# 一分钟浅谈:文件操作与文件流详解
【9月更文挑战第4天】在日常开发中,文件的读写是基本而重要的任务。C# 通过 `System.IO` 命名空间提供了多种工具,如 `FileStream`、`StreamReader` 和 `StreamWriter` 等,用于处理文件和流。本文从基础概念入手,详细介绍了这些类的使用方法,并讨论了常见错误及其避免策略,包括文件不存在、权限问题和文件被占用等。通过示例代码,展示了如何创建、读取文件以及进行二进制数据操作,并强调了异常处理和性能优化的重要性。掌握这些技巧对于提升编程能力至关重要。
143 2
|
存储 安全 编译器
C#中使用I/O文件流
流,即是二进制数值,文件和流 I/O(输入/输出)是指在存储媒介中传入或传出数据。在 .NET 中,System.IO命名空间包含允许以异步方式和同步方式对数据流和文件进行读取和写入操作的类型。这些命名空间还包含对文件执行压缩和解压缩的类型,以及通过管道和串行端口启用通信的类型。命名空间:System.IO程序集:System.Runtime.dll。
94 1
下载文件 | 下载流文件的处理方式
当下载文件时,返回为流的形式,所以在请求的时候设置 responseType:’arraybuffer’ 或者设置为 responseType: ‘blob’ 的时候,只有当接口返回正确的时候才会下载文件,返回错误的时候,应该是提示用户出错了,但是使用 arraybuffer 或者 blob 的时候,错误的信息也是返回这个形式的。所以需要转换一下。
163 0
|
XML 存储 移动开发
前端文件下载的正确打开方式
前端涉及到的文件下载还是很多应用场景的,那么前端文件下载有多少种方式呢?每种方式有什么优缺点呢?下面就来一一介绍。
166 0
|
存储 iOS开发 C++
C++中文件操作与文件流
🐰文件操作与文件流 🏡文件流类和文件流对象 🏡文件的打开与关闭 🌸1.文件的打开 🌸2.文件的关闭 🏡对文本文件的操作 🏡对二进制文件的操作 🌸1.用成员函数write和read操作二进制文件 🌸2.随机访问二进制文件
|
JSON 前端开发 数据格式
二进制流下载文件
二进制流下载文件
316 0
二进制流下载文件
文件下载
文件下载
79 0
下载文件
下载文件
110 0