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"

目录
相关文章
|
SQL 存储 关系型数据库
W9
|
12月前
|
运维 关系型数据库 MySQL
轻松管理Linux服务器的5个优秀管理面板
Websoft9 应用管理平台,github 2k star 开源软件,既有200+的优秀开源软件商店,一键安装。又有可视化的Linux管理面板,文件、数据库、ssl证书方便快捷管理。
W9
935 2
|
数据采集 机器学习/深度学习 算法
Python实现用PSO粒子群优化算法对KMeans聚类模型进行优化项目实战
Python实现用PSO粒子群优化算法对KMeans聚类模型进行优化项目实战
|
JavaScript
在vue中引入elementui
这篇文章介绍了如何在Vue项目中引入Element UI库,包括使用npm安装Element UI、在main.js文件中引入并注册,以及如何调用Element UI的组件。
|
前端开发 JavaScript 开发者
利用 el-select 和 el-tree 实现树形结构多选框联动功能
本文详细介绍了如何使用ElementUI中的el-select下拉选择器和el-tree树形控件来实现多功能联动选择器,包括多选、删除、搜索、清空选项等功能。通过树形控件展示复杂的层级结构,用户可以通过下拉选择树形节点,实时搜索节点,且支持批量选择和删除功能。文中提供了完整的HTML、JavaScript和CSS代码实现,帮助开发者快速集成此功能。
4627 0
利用 el-select 和 el-tree 实现树形结构多选框联动功能
|
JSON JavaScript 数据格式
文本-----wangEditor的使用,设置和获取内容,展示HTML无样式怎么办????console同步展示怎样写,Vue的配置在Vue3配置文件中的配置,是editor中的v-model绑定的值
文本-----wangEditor的使用,设置和获取内容,展示HTML无样式怎么办????console同步展示怎样写,Vue的配置在Vue3配置文件中的配置,是editor中的v-model绑定的值
|
NoSQL MongoDB 数据库
MongoDB的GUI工具——Robo 3T连接远程数据库MongoDB
MongoDB的GUI工具——Robo 3T连接远程数据库MongoDB
760 0
|
缓存 前端开发 NoSQL
设计与实现个人博客系统的技术架构与最佳实践
设计与实现个人博客系统的技术架构与最佳实践
|
缓存 JavaScript API
Vue-Router路由动态缓存组件(keep-alive),vue2/vue3不同写法
Vue-Router路由动态缓存组件(keep-alive),vue2/vue3不同写法
|
JavaScript API
vue3父子组件相互调用方法详解
vue3父子组件相互调用方法详解