当前位置: 首页 > news >正文

前端:下载文件(多种方法)

一、简介

前端经常会有下载文件的需求,这里总结了几种常用的方法,方便日后查看。

二、a标签下载

<a href="https://abc.png" download="abc.png" target="view_window">下载</a>

三、window.open下载

downloadTemple() {
      window.open(`url`);
    },

四、location.href

location.href = 'https://a.png';

五、saveAs

saveAs('https://abc.png')

六、loadFileSimply

6.1、loadFileSimply

// loadFileOps.js
import axiosOps from 'axios';
import cookie from 'js-cookie';
import { hasIn } from 'lodash';
import Vue from 'vue';

export const $loadFileSimply = param => {
  let token = cookie.get('token');
  let tenantId = cookie.get('tenantId');
  param.url += param.url.indexOf('?') > -1 ? '&' : '?';
  param.url += `tenantId=${tenantId}&_=${new Date().getTime()}`;
  return new Promise((resolve, reject) => {
    axiosOps({
      url: param.url,
      method: param.method,
      data: param.data,
      params: param.params,
      responseType: 'arraybuffer', // 请求成功时,后端返回文件流,正常导出文件;
      headers: {
        Authorization: `Bearer ${token}`,
        tenantId: tenantId
      },
      timeout: param.timeout ? param.timeout : 5000
    })
      .then(res => {
        resolve(res.data);
      })
      .catch(err => {
        Vue.$notify.error({
          title: '错误提示',
          message: '下载文件失败'
        });
        reject(err)
      });
  });
};

6.2、fileDownload

// 内容转化为文件下载
export const fileDownload = (file, fileName = '下载文件', options) => {
  // 创建隐藏的可下载链接
  let eleLink = document.createElement('a')
  eleLink.download = fileName
  eleLink.style.display = 'none'
  // 字符内容转变成blob地址
  let blob = options ? new Blob([file], options) : new Blob([file])
  eleLink.href = URL.createObjectURL(blob)
  // 触发点击
  document.body.appendChild(eleLink)
  eleLink.click()
  // 然后移除
  document.body.removeChild(eleLink)
}

6.3、使用

import { $loadFileSimply } from '@const/loadFileOps';
import { fileDownload } from '@const/utils.js';

downloadTemple() {
      $loadFileSimply({
        url: downloadUrl,
        method: 'post',
        params: { tempCode: 'SAAS_PUR_ORDER_TEMP' },
      })
        .then((res) => {
          fileDownload(res, '文件名称.xlsx'); // 下载并修改文件名
        })
        .catch(() => {
          this.$message.error('下载模板失败!');
        });
    },

七、url下载

// 地址下载,fileName暂无作用
export const urlDownload = (url, fileName = '下载文件') => {
  // 创建隐藏的可下载链接
  let eleLink = document.createElement('a')
  eleLink.download = fileName
  eleLink.style.display = 'none'
  eleLink.href = url
  // 触发点击
  document.body.appendChild(eleLink)
  eleLink.click()
  // 然后移除
  document.body.removeChild(eleLink)
}

八、多文件下载

/**
 * 以iframe的方式实现的多文件下载
 * @param { urls:array } - 需要下载的内容的数组列表,可以只有一条数据。
 */
export const dnLoadMultipleFiles = (urls) => {
  if (typeof urls !== 'object' || urls.length === 0) return
  urls.forEach(item => {
    const iframe = document.createElement('iframe')
    iframe.style.display = 'none' // 防止影响页面
    iframe.style.height = 0 // 防止影响页面
    iframe.src = item
    document.body.appendChild(iframe) // 这一行必须,iframe挂在到dom树上才会发请求
    // 5分钟之后删除(onload方法对于下载链接不起作用,就先这样吧)
    setTimeout(() => {
      iframe.remove()
    }, 5 * 60 * 1000)
  })
}

九、欢迎交流指正,关注我,一起学习。​​​​​​​

十、参考链接:

前端如何实现文件下载(七种方法)_前端程序的博客-CSDN博客_前端下载文件

axios请求设置responseType为'blob'或'arraybuffer'下载文件时,正确处理返回值为文件流或json对象的情况_倔强的小绵羊的博客-CSDN博客

axios 的responseType 类型动态设置_江小沫的博客-CSDN博客_axios responsetype

相关文章:

  • 猿创征文|【JavaSE】 Collection集合全家桶
  • 【Coppeliasim+Add-on】附加组件-喷涂路径自动生成及喷涂仿真
  • 简易下载并使用Jupyter(Anaconda)
  • 北京大学肖臻老师《区块链技术与应用》公开课笔记:以太坊(四):The DAO、反思、美链、总结
  • 算法与数据结构(2)--- 绪论(下)
  • 基于AAEncode编码的解密经历
  • 设定目标(1)- 为什么你每天感觉很忙却没什么拿得出手的成果?
  • 《大数据之路:阿里巴巴大数据实践》-第2篇 数据模型篇 -第9章 阿里巴巴数据整合及管理体系
  • 懂这些套路,开发到大客户不是什么难题
  • 市政管理学试题及答案
  • 第6章 - 多无人车系统的协同控制 --> 无人车运动原理
  • jmeter-11-Ant接口自动化及持续集成整合
  • 目标检测---以制作yolov5的数据集为例,利用labelimg制作自己的深度学习目标检测数据集(正确方法)
  • zookeeper的leader选举原理和底层源码实现超级详解
  • STM32——485通信实验
  • 「译」Node.js Streams 基础
  • Angular 2 DI - IoC DI - 1
  • avalon2.2的VM生成过程
  • ES6系统学习----从Apollo Client看解构赋值
  • Joomla 2.x, 3.x useful code cheatsheet
  • Laravel 中的一个后期静态绑定
  • MQ框架的比较
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • 初识 beanstalkd
  • 两列自适应布局方案整理
  • 普通函数和构造函数的区别
  • 数据可视化之 Sankey 桑基图的实现
  • 写给高年级小学生看的《Bash 指南》
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​插件化DPI在商用WIFI中的价值
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (C++17) std算法之执行策略 execution
  • (WSI分类)WSI分类文献小综述 2024
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (过滤器)Filter和(监听器)listener
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (七)Knockout 创建自定义绑定
  • (算法)前K大的和
  • (转)Unity3DUnity3D在android下调试
  • (转)四层和七层负载均衡的区别
  • .apk 成为历史!
  • .Net CF下精确的计时器
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET处理HTTP请求
  • .net反混淆脱壳工具de4dot的使用
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .NET应用架构设计:原则、模式与实践 目录预览
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • /boot 内存空间不够