前端文件下载的多种方式

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

  • 前言
  • 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.mzph.cn/news/673894.shtml

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

相关文章

B站UP主实时信息获取展示php源码

B站UP主实时数据展示系统 - PHP源码分享 想要实时追踪你心仪的B站UP主的最新动态吗&#xff1f;现在&#xff0c;你可以轻松获取并展示B站UP主的实时数据&#xff0c;包括粉丝数、作品数、头像、播放量等关键信息。 功能亮点&#xff1a; 实时更新&#xff1a;系统通过B站AP…

OpenCV识别视频中物体运动并截取保存

功能很简单&#xff1a;输入原始视频&#xff0c;输出视频中有画面变化的部分 适合理解基本框架&#xff0c;可以在这个基础上增加各种酷炫时髦的功能 [doge] ※注释非常保姆级※ import cv2 import numpy as np import os from datetime import datetime# 检测两帧之间变化…

航芯ACM32G103开发板评测 08 ADC Timer外设测试

航芯ACM32G103开发板评测 08 ADC Timer外设测试 1. 软硬件平台 ACM32G103 Board开发板MDK-ARM Keil 2. 定时器Timer 在一般的MCU芯片中&#xff0c;定时器这个外设资源是非常重要的&#xff0c;一般可以分为SysTick定时器&#xff08;系统滴答定时器&#xff09;、常规定时…

【洛谷 P1143】进制转换 题解(数学+除基取余法)

进制转换 题目描述 请你编一程序实现两种不同进制之间的数据转换。 输入格式 共三行&#xff0c;第一行是一个正整数&#xff0c;表示需要转换的数的进制 n ( 2 ≤ n ≤ 16 ) n\ (2\le n\le 16) n (2≤n≤16)&#xff0c;第二行是一个 n n n 进制数&#xff0c;若 n >…

【Django-ninja】在django ninja中处理异常

1. 直接抛内置异常 Django ninja内置了一些常用异常类。 from ninja.errors import HttpErrorapi.get("/some/resource") def some_operation(request):if True:raise HttpError(503, "Service Unavailable. Please retry later.")2. 覆写异常类 可以覆…

代码随想录算法训练营29期Day43|LeetCode 1049,494,474

文档讲解&#xff1a;最后一块石头的重量II 目标和 一和零 1049.最后一块石头的重量II 题目链接&#xff1a;https://leetcode.cn/problems/last-stone-weight-ii/description/ 思路&#xff1a; 本题其实就是尽量让石头分成重量相同的两堆&#xff0c;相撞之后剩下的石头最…

CTF秀 ctfshow WEB入门 web1-10 wp精讲

目录 web1_查看源码 web3_抓包 web4-9_目录文件 web10_cookie web1_查看源码 ctrlu 查看源码 web3_抓包 查看源码&#xff0c;无果 抓包&#xff0c;找到flag web4-9_目录文件 GitHub - maurosoria/dirsearch: Web path scanner 下载dirsearch工具扫一下就都出来了 web4-…

以“防方视角”观JS文件信息泄露

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 案例概述02 攻击路径03 防方思路 01 案例概述 这篇文章来自微信公众号“黑白之道”&#xff0c;记录的某师傅从js文件泄露接口信息&#xff0c;未授权获取大量敏感信息以及通过逻辑漏洞登录管理员账…

邦芒解析:跳槽到管理职位须分析的四点

如果跳槽到一般的管理职位&#xff0c;需要应聘者至少进行四方面的分析&#xff1a; ​一、自己实际的背景。包括应聘者所从事的行业、专业是什么&#xff1f;实际工作年限是多少、积攒了什么样的经验、已取得的业绩等&#xff1b; ​二、自己真实的能力。除了有好的业绩…

chagpt的原理详解

GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种基于Transformer架构的生成式预训练模型。GPT-3是其中的第三代&#xff0c;由OpenAI开发。下面是GPT的基本原理&#xff1a; Transformer架构&#xff1a; GPT基于Transformer架构&#xff0c;该架构由Att…

Vue中路由守卫的详细应用

作为一名web前端开发者&#xff0c;我们肯定经常使用Vue框架来构建我们的项目。而在Vue中&#xff0c;路由是非常重要的一部分&#xff0c;它能够实现页面的跳转和导航&#xff0c;提供更好的用户体验。然而&#xff0c;有时我们需要在路由跳转前或跳转后执行一些特定的逻辑&am…

C语言中的条件编译:探索编译时的决策

在C语言中&#xff0c;条件编译是一种特殊的编译技术&#xff0c;它允许开发者在编译时根据特定的条件选择性地包含或排除代码片段。这种技术非常有用&#xff0c;特别是当你想针对不同的平台、操作系统或配置编译不同的代码时。 在C语言中&#xff0c;条件编译主要通过预处理…

go语言进阶篇——面向对象(一)

什么是面向对象 在我们设计代码时&#xff0c;比如写一个算法题或者写一个问题结局办法时&#xff0c;我们常常会使用面向过程的方式来书写代码&#xff0c;面向过程主要指的是以解决问题为中心&#xff0c;按照一步步具体的步骤来编写代码或者调用函数&#xff0c;他在问题规…

后端的技术设计文档

一、 背景 1.简介 2.业务规划(非必需) 3.工作项拆解 拆解成多个工作项&#xff0c;每个工作项&#xff0c;需要多少人力。 4.资源评估(非必需) 有没有新的服务 二、架构设计 1.架构图(非必需&#xff0c;新服务比较需要) 2.技术选型 SpringCloud、Redis、Mysql、Myba…

SSL与TLS--一起学习技术干货之网络协议

一、定义 1、SSL协议&#xff08;Secure Sockets Layer Protocol&#xff09;&#xff1a;是一种安全协议&#xff0c;用于对网络通信提供安全保障。它最初由网景公司开发&#xff0c;现在由IETF维护标准。通过在应用层和传输层之间建立安全连接&#xff0c;SSL协议保护了数据…

优化 IT 支出和消除浪费的 8 种主要方法

不懈追求最佳 IT 支出对于任何组织的长期可持续发展和成功都至关重要。在这个技术快速进步的时代&#xff0c;您必须做出明智的决策&#xff0c;消除浪费&#xff0c;同时最大限度地提高技术投资的价值。 从进行 IT 成本分析到采用敏捷预算和技术标准化&#xff0c;这些策略对…

双非本科准备秋招(19.1)—— Synchronized优化

轻量级锁 流程 一个对象虽然有多线程加锁&#xff0c;但是加锁时间是错开的&#xff0c;那么可以用轻量级锁优化。 语法还是synchronized&#xff0c;只是对使用者是透明的。 static final Object obj new Object(); public static void method1() {synchronized( obj ) {//…

代码随想录算法训练营第二十五天|216.组合总和III、17.电话号码的字母组合

回溯算法之组合问题&#xff1a; 216.组合总和III class Solution { public:vector<vector<int>> result;vector<int> path;void backtracking(int k,int n,int t,int sum){if(path.size()k){if(sumn)result.push_back(path);return;}for(int it;i<9;i)…

(力扣)1314.矩阵区域和

给你一个 m x n 的矩阵 mat 和一个整数 k &#xff0c;请你返回一个矩阵 answer &#xff0c;其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和&#xff1a; i - k < r < i k, j - k < c < j k 且(r, c) 在矩阵内。 示例 1&#xff1a; 输入&a…

【Godot4.2】文件系统自定义控件 - FileSystemTree

FileSystemTree B站【Godot4.2】文件系统自定义节点 - FileSystemTree 概述 在Godot设计编辑器插件或应用程序时&#xff0c;可能需要涉及文件系统的显示&#xff0c;比如文件夹或文件的树形列表。 我们可以用Godot的Tree控件快速书写相应的功能&#xff0c;但是为了复用到…