前端文件下载的多种方式

前端文件下载的多种方式。

  • 前言
  • a标签下载
    • a标签常用属性介绍- target,href,download。
  • window.location.href下载
  • window.open下载
  • iframe 下载
  • 动态生成a标签下载
    • 文件url下载
    • 文件流下载
    • blob文件流转换常用类型
  • 使用 streamSaver 看实时下载进度

前言

如果我们要下载一些浏览器读不懂的文件,我们可以使用 < a >标签在新窗口打开链接,也可以使用 windows.open(‘url’) 的方式打开新窗口进行下载。
但如果这个文件浏览器是读得懂的,比如 .txt 文件,那浏览器就不会执行下载,而是会直接在页面中把文件内容展示出来。
根据这个特性,我们可以根据需求自由选择如下方案进行下载

a标签下载

<a href="链接" download="链接名称"> //点击下载

a标签常用属性介绍- target,href,download。

  • target属性
    在这里插入图片描述
  • href属性

如果 < a > 标签没有 href 属性,它只是一个超链接的占位符。

<a href="http://baidu.com">在当前窗口打开百度链接</a>
<a href="http://baidu.com" target="_blank">在新窗口打开百度链接</a>
<a href="#">网页返回顶部</a>
<a href="#miss">锚点跳转——本页面跳转</a>
  • download 属性

download 规定当用户单击超链接时将下载目标(href 属性中规定的文件)。
download 的值为文件下载后的新名称。允许使用任何值,浏览器会自动检测正确的文件扩展名并将其添加到文件中(例如 .img、.pdf、.txt、.html 等)
网络图片download无效,点击为预览

<a href="图片链接" download="图片名称"> //点击下载图片
<a href="pdf链接" download="1.pdf" target="_blank">pdf下载</a> //下载pdf,浏览器不自动打开 记得让后台给.pdf加个content-type头:application/octet-strea

window.location.href下载

// 通用下载方法
export function download(url) {
window.location.href = url
}

直接访问可能会覆盖当前页面地址,影响用户体验。
只有.pdf和图片可以实现跳转另一个新窗口进行预览,其他格式是下载

window.open下载

export function download(url) {window.open(url);},

这个方法只能将指定路径的资源加载到浏览器里面,如果文件不能被浏览器浏览,那就会被浏览器下载到本地。反之,如果下载一个txt文本,用该方法会直接预览txt文件

iframe 下载

export function download(url) {window.open("about:blank");const iframe = document.createElement("iframe");iframe.src = url;iframe.style.width = "100%";iframe.style.height = "100vh";iframe.style.margin = "0";iframe.style.padding = "0";iframe.style.overflow = "hidden";iframe.style.border = "none";win.document.body.style.margin = "0";win.document.body.appendChild(iframe);
}

动态生成a标签下载

文件url下载

export function download(url) {const link = document.createElement('a');link.style.display = 'none';link.download ="文件名";link.href = url;link.click();document.body.removeChild(link);
}

文件流下载

// 用fetch发送请求 对请求回来的二进制文件流进行处理 如果返回的就是文件流 则直接进行fetch后的步骤则可
export function download(url) {fetch(url).then((response) => response.blob()) // 获取文件数据流.then((blob) => {const url = window.URL.createObjectURL(new Blob([blob], {type: "根据文件类型写不同的type",})); // 生成文件在浏览器中的链接const a = document.createElement("a");a.href = url;a.download = "文件名"; // 文件名 如果是视频格式 需要加上后缀名 “.flv /.mp4”a.style.display = "none";document.body.appendChild(a);a.click();document.body.removeChild(a);window.URL.revokeObjectURL(url); // 清除文件链接}).catch(console.error);}

如果遇到下载 txt、jpg 等文件时出现直接打开文件而不是下载文件的情况时,可以在下载地址即 url 后拼接 ‘?response-content-type=application/octet-stream’ 即可

blob文件流转换常用类型

后缀MIME Type
.docapplication/msword
.docxapplication/vnd.openxmlformats-officedocument.wordprocessingml.document
.xlsapplication/vnd.ms-excel
.xlsxapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.pptapplication/vnd.ms-powerpoint
.pptxapplication/vnd.openxmlformats-officedocument.presentationml.presentation
.flvflv-application/octet-stream
.pdfapplication/pdf
.pngimage/png
.gifimage/gif
.jpeg .jpgimage/jpeg
.mp3audio/mpeg
.mp4video/mpeg4
.htmltext/html
.csstext/css
.jstext/javascript
.jsonapplication/json
.zipapplication/zip

使用 streamSaver 看实时下载进度

StreamSaver源码地址

npm i streamsaver
import streamSaver from "streamsaver"

使用 StreamSaver.js 下载文件的大概流程是这样的(为了方便理解,我用一些不专业的术语进行描述)

  • 创建一个文件,该文件支持写入操作。streamSaver.createWriteStream(‘文件名.后缀’)。
  • 使用 fetch 方法访问文件的url,将内容一点点的放到 StreamSaver 创建的文件里。
  • 监听文件内容是否读取完整,读取完就执行“保存并关闭文件”的操作。
      fetch(url).then((res) => {const fileStream = streamSaver.createWriteStream("历史视频.flv",//文件名{size: res.headers.get("content-length"),});const readableStream = res.body;if (window.WritableStream && readableStream.pipeTo) {return readableStream.pipeTo(fileStream).then(() => {});}window.writer = fileStream.getWriter();const reader = res.body.getReader();const pump = () =>reader.read().then((res) =>res.done ? window.writer.close() : window.writer.write(res.value).then(pump));pump();});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/455828.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

互联网加竞赛 基于深度学习的行人重识别(person reid)

文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的行人重识别 该项目较为新颖&#xff0c;适合…

嵌入式软件bug分析基本要求

摘要&#xff1a;软件从来不是一次就能完美的&#xff0c;需要以包容的眼光看待它的残缺。那问题究竟为何产生&#xff0c;如何去除呢&#xff1f; 1、软件问题从哪来 软件缺陷问题千千万万&#xff0c;主要是需求、实现、和运行环境三方面。 1.1 需求描述偏差 客户角度的描…

GADM 4.1 全球国家行政区划下载

扫描文末二维码&#xff0c;关注微信公众号&#xff1a;ThsPool 后台回复g004&#xff0c;领取最新 GADM 4.1 全球国家行政区划 GADM概述 GADM&#xff0c;全称 Database of Global Administrative Areas&#xff0c;是一个开放获取的全球行政区划数据库&#xff0c;包含各国、…

教授LLM思考和行动:ReAct提示词工程

ReAct&#xff1a;论文主页 原文链接&#xff1a;Teaching LLMs to Think and Act: ReAct Prompt Engineering 在人类从事一项需要多个步骤的任务时&#xff0c;而步骤和步骤之间&#xff0c;或者说动作和动作之间&#xff0c;往往会有一个推理过程。让LLM把内心独白说出来&am…

React+echarts实现排名+自动滚动+X轴自定义titleTop

1、效果 2、环境准备 1、react18 2、antd 4 3、代码实现 原理&#xff1a;自动滚动通过创建定时器动态更新echar的dataZoom属性startValue、endValue&#xff0c;自定义tooltip通过监听echar的鼠标移入移出事件&#xff0c;判断tooltTip元素的显隐以及位置。 /*** 收集完成…

nacos注册服务之后调用找不到调用的service注册服务问题

我的项目只包含user用户模块、order订单模块&#xff0c;并且配置了这两个模块的服务 订单服务order模块的注册&#xff1a; 用户服务user模块的注册: 报错&#xff1a; 经过一番查询我知道了要在RestTemplate这个bean上加上LoadBalanced注解来开启负载均衡&#xff0c;上面我…

前端实现搜索框筛选

效果图 页面解析 是一个input输入框和一个button按钮组成输入框查询 内容是一个折叠面板 html代码 <div class"left-content-box"><div class"colum-search"><el-input v-model"columKey" clearable placeholder"请输入关…

【达梦数据库】使用DBeaver管理达梦数据库

使用DBeaver管理达梦数据库 Step1 安装相关程序 达梦8数据库DBeaver社区版 Step2 新建驱动 类型参数驱动名称DM8驱动类型Generic类名dm.jdbc.driver.DmDriverURL模板jdbc:dm://{host}:{port}默认端口5236默认数据库默认用户SYSDBA Step3 连接服务

标准库 STM32+EC11编码器+I2C ssd1306多级菜单例程

标准库 STM32EC11编码器I2C ssd1306多级菜单例程 &#x1f4cc;原创项目来源于&#xff1a;https://github.com/AdamLoong/Embedded_Menu_Simple&#x1f4cd;相关功能演示观看&#xff1a;https://space.bilibili.com/74495335 单片机多级菜单v1.2 &#x1f449;本次采用的是原…

docker-学习-5

docker-学习第五天 docker-学习第五天1. 昨天的练习回顾1.1. 练习11.2. 练习2 2. 命令2.1. 看镜像的详细信息 3. Dockerfile指令3.1. 常见的指令3.2. ENTRYPOINT和CMD的区别3.3. RUN中的set指令 4. 镜像的原理4.1. 为什么 Docker 镜像要采用这种分层结构呢&#xff1f;4.2. doc…

leetcode(双指针)283.移动零(C++)DAY3

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 示例 1: 输入…

嵌入式软件设计方式与方法

1、嵌入式软件与设计模式 思从深而行从简 软件开发&#xff0c;难的不是编写软件&#xff0c;而是编写功能正常的软件。软件工程化才能保证软件质量和项目进度&#xff0c;而设计模式使代码开发真正工程化&#xff0c;设计模式是软件工程的基石。 所谓设计模式就是对常见问题的…