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

2023-09-22 15:23:09

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

失败方案

使用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浏览器

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

更多推荐

租用好服务器后怎么操作?

很多企业咨询完租用好服务器后都会有一些不知所措,不知道改如何操作,今天小编就跟大家讲一讲租用好服务器后要进行以下几个注意事项。修改系统以后要尽快修改服务器的密码,租用服务器后正规的IDC服务器商是会自主完成这一步骤的,重做系统后修改好的服务器密码一定要保存好。不随意下载。不能像普通电脑一拿到手就开始立刻下载各种软件、A

Lua学习笔记:词法分析

前言本篇在讲什么Lua的词法分析本篇需要什么对Lua语法有简单认知对C++语法有简单认知依赖VisualStudio工具本篇的特色具有全流程的图文教学重实践,轻理论,快速上手提供全流程的源码内容★提高阅读体验★👉♠一级标题👈👉♥二级标题👈👉♣三级标题👈👉♦四级标题👈目录♠前言♠luaL_dofile♠保

【STL容器】list

文章目录一、list定义二、list的迭代器三、list的元素操作四,list的优缺点一、list定义list本质是一个双向带头循环链表template<classT>structlist_node{list_node*prev;Tval;list_node*next;};template<classT>classli

数据结构与算法(C语言版)P3.2---链表之带头双向循环链表的实现

1、前言前面一章详细介绍了链表的概念、结构以及分类。并且实现了无头单向非循环链表。这一篇主要实现带头双向循环链表的。由于需要串联前面的知识,把上一篇至此:链表之无头单向非循环链表的实现2、带头双向循环链表的特性和结构2.1、结构(1)、每个结点有两个指针域(next,prev),一个数据域(data)。(2)前面结点的

cms之帝国cms安装

内容摘要帝国网站管理系统,英文名称为EmpireCMS,简称“帝国CMS”,本文将介绍帝国网站管理系统的安装方法。前言:本文安装教程是以帝国CMS7.5版本为基础进行图文讲解。各位看官,一定要按照每个步骤去执行,技术是以熟能生巧为主,在学习的过程中,要认真仔细的去做好每一步。关注我,手把手帮你搭建自己的小窝一、安装前准

Spring源码分析(三) IOC 之 getBean()和doGetBean()

b、在中篇会正式经历一套生命周期流程getBean()->doGetBean()->createBean()->doCreateBean()->createBeanInstance()->populateBean()->initializeBean()流程1、AbstractBeanFactory#getBean()此

计算机遇到MSVCP140.dll丢失问题?全面分析解决方案

今天我要和大家分享的主题是:计算机中丢失MSVCP140.dll的解决方法。在我们日常使用电脑的过程中,经常会遇到一些棘手的问题,而MSVCP140.dll文件丢失就是其中之一。这个问题可能会给我们的工作、学习和娱乐带来诸多不便,因此我希望通过今天的演讲,能够帮助大家解决这个问题。首先,让我们来了解一下什么是MSVCP

面对突如其来的 GC 问题如何下手解决

今天我们主要从一个实战案例入手分析面对突如其来的GC问题该如何下手解决。想要下手解决GC问题,我们首先需要掌握下面这三种问题。如何使用jstat命令查看JVM的GC情况?面对海量GC日志参数,如何快速抓住问题根源?你不得不掌握的日志分析工具。工欲善其事,必先利其器。我们前面课时讲到的优化手段,包括代码优化、扩容、参数优

OpenWrt kernel install分析(2)

一.前言接下来分析make-CimagecompileinstallTARGET_BUILD=。二.Makefile分析1.命令首先运行target/linux/mediatek/image/Makefile,该文件内容如下:target/linux/mediatek/image/Makefile:include$(T

Win32 位图直接绘制

CBitmapDraw.h#pragmaonce#include<wtypes.h>#include<type_traits>#defineCOLOR_RGB_TO_BGR(_rgb)((_rgb&0xFF)<<16)|(_rgb&0x00FF00)|((_rgb>>16)&0xFF)typedefstruct_BIT

易点易动库存管理系统:引领库存用量控制新时代,助力企业节约成本

在现代企业经营中,库存管理一直是一个关键的环节。过多的库存会造成资金占用和浪费,而过少的库存则容易导致生产中断和客户满意度下降。为了解决这一难题,易点易动库存管理系统应运而生。一、全面的库存数据管理易点易动库存管理系统通过与企业的仓储系统实时对接,实现了对库存数据的全面管理。无论是原材料、半成品还是成品,系统都能准确记

热文推荐