默认最简单的下载方式是:window.open(后台接口API路径),但该方法弊端:因是新开窗口方式,前端展示上,每次会闪下。

此外,如果使用window.open(文件URL)方式:

  • pdf、office文档、psd:直接下载。
  • 图片、txt:新开窗口预览,不会下载;且txt预览,有时出现中文乱码问题。

一、根据文件URL下载

实现原理:通过a标签实现下载。

/*** @method 下载单个文件(文件类型可任意:.png、txt、office文档、.psd等)* @param { String } url - 文件的http完整路径, 如:http: //xxx.png* @param { String } fileName - 文件名,注意是要带文件后缀名,如:xxx.png* @doc https://blog.csdn.net/weixin_39547158/article/details/110851570*/
export function downloadFile(url: string, fileName: string) {return new Promise((resolve, reject) => {const xhr = new XMLHttpRequest();xhr.open('GET', url, true);xhr.responseType = 'blob';xhr.upload.onprogress = (e) => {if (e.lengthComputable) {let progress = e.loaded / e.total;console.log('文件上传进度是', progress);}};xhr.onload = function () {const url = window.URL.createObjectURL(xhr.response);const eleLink = document.createElement('a');eleLink.href = url;eleLink.download = `${fileName}`;eleLink.style.display = 'none';document.body.appendChild(eleLink);eleLink.click();document.body.removeChild(eleLink);resolve('success');};xhr.onerror = (e) => {console.log('请求错误回调', e);message.warning('下载文件失败')reject(e);};xhr.send();});
}

二、excel文件:调用后台接口返回文件流,前端下载文件

实现原理:调用后台接口,返回blob, 前端使用file-saver库实现下载。

// 下载excel文件
import { saveAs } from 'file-saver';const downloadTemplate = async () => {try {const params = { ... } // 传参const res = await generateDownStreamReconciliationUsingGET(params);// res为返回结果if (res) {const blob = new Blob([res], { type: 'application/vnd.ms-excel' });FileSaver.saveAs(blob, '对账单.xlsx');console.log('对账单下载成功')}} catch (e) {console.log(e);} finally {console.log('finally')}
};
// 生成对账excel模板表格API
export async function generateDownStreamReconciliationUsingGET(params: API.generateDownStreamReconciliationUsingGETParams,options?: { [key: string]: any },
) {return request<any>(`${process.env.APP_HOST_WAYBILL}/xxx/generateDownStreamReconciliation`,{method: 'GET',responseType: 'blob',  // 必须写该行,否则:后台返回的是string,不是blob且文件下载后,会出现打不开问题。params: {...params,},...(options || {}),},);
}

三、多文件URL下载,前端生成压缩包下载

实现原理:jszip库 + file-saver库

import { getBlobOfUrl } from '@/services/common';
import { saveAs } from 'file-saver';
import JSZip from 'jszip';
import { message } from 'antd';/*** @method 同时下载多文件,并生成一个压缩包* @param { Object[] } fileInfoList - 文件列表* @param { String } urlField - 文件URL的字段名* @param { String } fileNameField - 文件名的字段名* @param { String } folderName - 压缩包 & 文件夹名称*/
export function downloadAsZip(fileInfoList: any[],folderName = '文件压缩包',urlField = 'filePath',fileNameField = 'name',
) {return new Promise((resolve, reject) => {const zip = new JSZip();// const folder = zip.folder(folderName); // 创建文件夹const promisesList = fileInfoList.map((item) => {return getBlobOfUrl(item[urlField]).then((data) => {// console.log(data); // Blob// folder.file(item[fileNameField], data, { binary: true }); // 往文件夹中存放文件zip.file(item[fileNameField], data, { binary: true }); // 不创建文件夹}).catch((e) => {console.log(e);message.warning(e?.message || '获取文件流失败')});});Promise.all(promisesList).then(() => {zip.generateAsync({ type: 'blob' }).then((content) => {saveAs(content, folderName);resolve('success');}).catch((e) => {message.warning(e?.message || '生成压缩包失败')reject(e);});}).catch((e) => {message.warning(e?.message || '批量获取文件流失败')reject(e);});});
}
import { request } from 'umi';/*** @method 根据文件URL获取blob数据流的API* @param { String } fileUrl - 文件完整路径,如:http://xxx.png*/
export function getBlobOfUrl(fileUrl: string) {return request(fileUrl, {method: 'GET',responseType: 'blob', // 设置后台返回的内容类型为blobparams: {notAuthorization: true,},});
}

前端实现下载文件(包含压缩包下载)方式汇总相关推荐

  1. 前端下载文件的几种方式

    前端下载文件的几种方式 前言 1. window.open 2. window.location.href 3. a标签 4. iframe 5. blob 前言 总结下载文件的几种方式,文件都是通过 ...

  2. java 文件下载详解_Java 从网上下载文件的几种方式实例代码详解

    废话不多说了,直接给大家贴代码了,具体代码如下所示: package com.github.pandafang.tool; import java.io.BufferedOutputStream; i ...

  3. python 下载文件-Python下载文件的11种方式

    原标题:Python下载文件的11种方式 在本教程中,你将学习如何使用不同的Python模块从web下载文件.此外,你将下载常规文件.web页面.Amazon S3和其他资源. 最后,你将学习如何克服 ...

  4. 用python下载文件的若干种方法汇总

    压缩文件可以直接放到下载器里面下载的 you-get 连接 下载任意文件 重点 用python下载文件的若干种方法汇总 写文章 用python下载文件的若干种方法汇总 zhangqibot发表于Met ...

  5. python实现http下载文件-Python HTTP下载文件并显示下载进度条功能的实现

    下面的Python脚本中利用request下载文件并写入到文件系统,利用progressbar模块显示下载进度条. 其中利用request模块下载文件可以直接下载,不需要使用open方法,例如: im ...

  6. 成功解决百度网盘下载文件时遇到 下载总进度一直处于99.9%,显示一直下载不下来的问题

    成功解决百度网盘下载文件时遇到 下载总进度一直处于99.9%,显示一直下载不下来的问题 目录 解决问题 解决思路 解决方法 解决问题 百度网盘下载文件时遇到 下载总进度一直处于99.9%,显示一直下载 ...

  7. Vue 通过url下载文件并对下载的文件更名

    Vue 通过url下载文件并对下载的文件更名 HTML如下: <div @click="downloadFile(url,name)">点击下载</div> ...

  8. python如何实现下载文件_python实现下载文件的三种方法

    python实现下载文件的三种方法 Python开发中时长遇到要下载文件的情况,最常用的方法就是通过Http利用urllib或者urllib2模块. 当然你也可以利用ftplib从ftp站点下载文件. ...

  9. js下载文件,javascript下载文件,FileSaver.js,页面元素保存成文件

    js下载文件,javascript下载文件,FileSaver.js,页面元素保存成文件 ================================ ©Copyright 蕃薯耀 2020-07 ...

  10. python 常用文件读取和保存方式汇总

    python 常用文件读取和保存方式汇总 txt文件 open和close函数 文件对象的方法 读写示例理解rwa中的指针 w a r txt文件 open和close函数 fileObject = ...

最新文章

  1. java 中的 serialVersionUID
  2. Apache常见配置错误
  3. ZOJ 1292 Integer Inquiry
  4. 关于Bitmap中的inBitmap变量的学习与使用
  5. Java中String转Long方式及注意事项
  6. 福师计算机应用基础期末,福师2015计算机应用基础》期末试卷A123
  7. 帅帅什么意思_为什么99%的花艺师都害怕创作?
  8. SharePoint快速调试技巧
  9. redis zset怎么排序_关于Redis(一)
  10. Java调用python传参数并获取python返回的值
  11. 信息安全工程师教程学习笔记汇总(思维导图及考试要点)
  12. 计算机技术在印刷中的应用,网络技术在印刷中的应用技巧
  13. 京东热销榜排名第一的运营书籍《运营之光》读后笔记
  14. win10计算机睡眠 隔几分钟就唤醒,win10系统点击睡眠后又迅速自动唤醒怎么办
  15. L1-030. 一帮一
  16. 2022年下半年软考网络规划设计师下午真题及答案解析
  17. 如何编写firefox插件
  18. 开源 chatgpt 项目私有化部署
  19. Java IO用法详解
  20. c4d中的语言菜单,C4D的菜单(选择)

热门文章

  1. 归一化的意义笔记:归纳统一样本的统计分布性
  2. KNX EIB 线缆 电缆 J-Y(st)YH 2x2x0.8
  3. shell脚本自理版
  4. ORA-00911 部分机器报错,部分不报
  5. Vim跳转到指定行的三种方法
  6. 【20】核心易中期刊推荐——计算机科学电子通信(EI索引)
  7. Live800:服务经济时代,企业如何满足客户需求?
  8. cpp mqtt paho 使用_paho-mqtt 回调方法的一次封装
  9. 微信小程序动态绑定style样式
  10. 前端 JS 设计模式之设计原则