h5下载文件,无兼容问题~

news2024/11/20 18:21:38

最近写了个页面,打开页面出现文件列表,用户可以下载文件。

失败方案

使用a标签进行下载,参考代码如下:

因为有批量下载的需求,这里将xhr请求单独封装到downloadFile.js中

// downloadFile.js
const downloadFile = (url, onProgress, xhrAr) => {
    console.log(url,'urlurl');
    return new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest();
        xhr.open('GET', url, true);
        xhr.responseType = 'blob';
        xhrAr.push(xhr) // 存放下载任务
        xhr.onprogress = (event) => {	// 进度条
            onProgress(event);
            // if (event.lengthComputable) {
            //     const percent = Math.round((event.loaded / event.total) * 100);
            //     onProgress(percent);
            // }
        };

        xhr.onload = () => {
            if (xhr.status === 200) {
                const blob = xhr.response;
                resolve(blob);
            } else {
                reject(new Error('下载失败'));
            }
        };

        xhr.onerror = () => {
            reject(new Error('下载失败'));
        };

        xhr.send();
    });
}

页面使用,代码如下:

const click = () => {
	list.forEach((item, index) => {	// 文件数组,批量下载
        console.log(item, 'itemitem');
        let url = serverAPIPrefix + item.filePath
 
        const onProgress = (event) => {	// 进度条处理事件
             console.log(item, 'itemitem');
        };
        downLoadFile(url, onProgress, dlm.currentTaskList).then((blob) => {
            // 处理下载完成的文件
            const url = URL.createObjectURL(blob);
            const a = document.createElement('a');
            a.style.display = 'none';
            a.href = url;
            a.download = item.road ? item.road : '护驾文件管理' + Date.now();
            document.body.appendChild(a);
            a.click();
            URL.revokeObjectURL(url);
        }).catch((error) => {
            console.error('下载失败', error);
        });
    })
}

可以看到,就是用了a标签进行下载。

完成之后pc端没问题,在进行移动端测试时,发现有些浏览器不支持

浏览器是否可以下载
safari
华为自带浏览器
vivo自带
oppo自带
uc浏览器
qq浏览器
百度浏览器

测试如上,具体表现为,创建了下载任务,但进度条一直是0%

成功方案

需要后端添加响应头信息,具体可查看 MDN链接

Content-Disposition: attachment; filename=326.mp4
filename:下载下来的文件名,可根据下载文件类型自行修改

在这里插入图片描述

加上这个响应头后,访问链接就是直接下载,所以我们直接访问链接就可以,无需做其他操作,代码如下:

	let url =  item.filePath
	window.open(url)  
 

如果只是单文件下载,直接使用window.open打开url,就会自行执行下载。
移动端会在浏览器中自行创建下载任务,用户可在浏览器的下载管理中查看

但是我们还有个需求,就是批量下载,循环setimeout使用window.open?经过测试,也存在浏览器的差异,下载视频下不全,选择了三个视频下载,结果只下载了两个,有的浏览器还是只能下载一个

list.forEach(item,index)=>{
		setTimeout(() => {
            window.open(item.url)
        }, index * 1000);
})

既然访问链接直接进行下载,我们只需要打开页面就行,window.open也是同理,但是浏览器为了防止开发人员不断打开新页面,所以window.open是禁止循环调用,打开多个页面使用iframe
代码如下:

let triggerDelay = 100;
let removeDelay = 1000;
this.urlList.forEach((url, index) => {
  this.createIFrame(url, index * triggerDelay, removeDelay);
});

// 这里是创建iframe的方法
function createIFrame(url, triggerDelay, removeDelay) {
   //动态添加iframe,设置src,然后删除
   setTimeout(function() {
     var frame = document.createElement("iframe");
     frame.src = url;
     frame.style.display = "none";
     document.body.appendChild(frame);
     setTimeout(function() {
       frame.remove();
     }, removeDelay);
   }, triggerDelay);
 },

原文链接点击直达

使用iframe仍有部分浏览器不支持

浏览器是否支持
百度浏览器
UC浏览器
oppo自带浏览器
华为自带浏览器
vivo自带浏览器
safari
QQ浏览器

到这里并未完全解决批量下载文件的功能,如有指教欢迎评论~

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

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

相关文章

Flutter超好用的路由库-fluro

文章目录 fluro的介绍fluro简介安装和导入路由配置导航到路由参数传递 fluro的典型使用创建路由管理类代码解释例子小结 初始化路由导航到路由 总结 fluro的介绍 fluro简介 fluro是一个流行的Flutter插件,用于实现高级路由管理。它提供了灵活的路由配置和导航功能…

VR科普研学基地科普开放日普乐蛙VR体验馆沉浸式体验设备

广州科普开放日来啦 2023年9月广州科普开放日来啦,9月16日周六上午9点,广州卓远非常荣幸地迎来了一批前来体验的家庭。 比原定的集合时间提前了近1个小时,已经开始有家长带着小朋友来到了VR科普基地,可见大家对VR科普体验的热情和…

轻量服务器是不是vps ?和vps有什么区别

​  轻量型服务器是介于云服务器和共享型服务器之间的一种解决方案。它提供较为独立的资源分配,但规模较小,适用于中小型网站和应用程序。轻量型服务器的硬件资源来源于大型的公有云集群的虚拟化技术。轻量型服务器的性能和带宽可能会稍逊于云服务器。…

【笨~~~】在python中导入另一个模块的函数时,为什么会运行模块中剩下的部分??顶层?

一个程序员一生中可能会邂逅各种各样的算法,但总有那么几种,是作为一个程序员一定会遇见且大概率需要掌握的算法。今天就来聊聊这些十分重要的“必抓!”算法吧~ Python导入了其他文件中的函数,运行时连着这个文件一起运行了 在py…

椭圆曲线加密算法

椭圆曲线密码学(Elliptic curve cryptography),简称ECC,是一种建立公开密钥加密的算法,也就是非对称加密。类似的还有RSA,ElGamal算法等。ECC被公认为在给定密钥长度下最安全的加密算法。比特币中的公私钥生…

什么是文档签名证书?PDF文档怎么签名?

什么是文档签名证书?在“互联网”时代,电子合同、电子证照、电子病历、电子保单等各类电子文档无纸化应用成为常态。如何让电子文档的签署、审批具有公信力及法律效力,防止伪造签名、假冒签名等问题出现,是电子文档无纸化应用的主…

画一个时钟(html+css+js)

这是一个很简约的时钟。。。。。。。 效果&#xff1a; 代码&#xff1a; <template><div class"demo-box"><div class"clock"><ul class"mark"><liv-for"(rotate, index) in rotatedAngles":key"i…

echarts图表 实现高度按照 内容撑起来或者超出部分滚动展示效果

背景&#xff1a;因为数据不固定 高度写死导致数据显示不全&#xff0c;所以图表高度要根据内容计算 实现代码如下&#xff1a; <divv-if"showCharts"id"business-bars"class"chart":style"{ height: chartHeight px }"></d…

如何做接口测试呢?接口测试有哪些工具

回想入职测试已经10年时间了&#xff0c;初入职场的我对于接口测试茫然不知。后来因为业务需要&#xff0c;开始慢慢接触接口测试。从最开始使用工具进行接口测试到编写代码实现接口自动化&#xff0c;到最后的测试平台开发。回想这一路走来感触颇深&#xff0c;因此为了避免打…

数据结构-----串(String)详解

目录 前言 1.串的定义 相关类型 2.串的储存结构 顺序储存表示 堆分配储存表示 块链储存表示 3.串的操作方式 4.串的匹配算法 &#xff08;1&#xff09;BF算法 过程原理 代码实现&#xff08;C/C&#xff09; 算法分析 &#xff08;2&#xff09;KMP算法 过程…

2.(vue3.x+vite)组件注册并调用

前端技术社区总目录(订阅之前请先查看该博客) 关联博客 1.(vue3.x+vite)封装组件 一:umd调用方式 1:引入umd.js <script src="./public/myvue5.umd.js"></script>2:编写代码调用 (1)umd方式,根据“5

四川天蝶电子商务有限公司真实吗?

四川天蝶电子商务有限公司是一家专注于电商行业的企业&#xff0c;他们通过自己的经验和专业知识&#xff0c;教人带货的方法和技巧。带货是指通过社交媒体或其他渠道&#xff0c;向消费者推销商品并实现销售的过程。 教人带货的方法主要有以下几点&#xff1a; 1.选择合适的平…

以酒为媒、以酒载道,五粮液携手首届“金熊猫奖”,讲好中国白酒故事

执笔 | 尼 奥 编辑 | 萧 萧 这是一次光影艺术与白酒酿造的和美之约&#xff0c;也是中国文化与世界多元文明的交融时刻&#xff0c;在影视与美酒的碰撞瞬间&#xff0c;共同擘画“美美与共&#xff0c;天下大同”的文明图景。 9月19-20日&#xff0c;以“多彩文明荣耀光影…

Webshell 流量特征分析

前言&#xff1a;webshell是以asp、php、jsp或者cgi等网页文件形式存在的一种代码执行环境&#xff0c;主要用于网站管理、服务器管理、权限管理等操作。使用方法简单&#xff0c;只需上传一个代码文件&#xff0c;通过网址访问&#xff0c;便可进行很多日常操作&#xff0c;极…

2023-2024年最新大数据学习路线

文章目录 2023-2024年最新大数据学习路线大数据开发入门*01*阶段案例实战 大数据核心基础*02*阶段案例实战 千亿级数仓技术*03*阶段项目实战 PB级内存计算04阶段项目实战 亚秒级实时计算*05*阶段项目实战 大厂面试*06* 2023-2024年最新大数据学习路线 新路线图在Spark一章不再…

CSS 基础 3

目录 &#x1f680; 导读 -- target 盒子模型 看透网页布局的本质 盒子模型组成 边框(border) border-style ​编辑border-color border-width 边框写法 简写 分开写 表格细线边框 边框会影响盒子实际大小 内边距 内容 内边距-padding padding属性简写 pad…

vue点击pdf文件直接在浏览器中预览文件

好久没有更新文章了&#xff0c;说说为什么会有这篇文章呢&#xff0c;其实是应某个热线评论的要求出的&#xff0c;不过由于最近很长一段时间没打开csdn现在才看到&#xff0c;所以才会导致到现在才出。 先来看看封装完这个预览方法的使用&#xff0c;主打一个方便使用&#x…

Java学习day06:面向对象基础,构造方法,成员/局部变量

声明&#xff1a;该专栏本人重新过一遍java知识点时候的笔记汇总&#xff0c;主要是每天的知识点题解&#xff0c;算是让自己巩固复习&#xff0c;也希望能给初学的朋友们一点帮助&#xff0c;大佬们不喜勿喷(抱拳了老铁&#xff01;) Java学习day06&#xff1a;面向对象基础&a…

网络爬虫相关概念

目录 1、什么是爬虫&#xff1f; 2、网络爬虫步骤 3、爬虫核心 4、爬虫的用途 5、爬虫分类 6、反爬手段 1、什么是爬虫&#xff1f; 如果我们把互联网比作一张大的蜘蛛网&#xff0c;那一台计算机上的数据便是蜘蛛网上的一个猎物&#xff0c;而爬虫程序就是一只小蜘蛛&am…