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


    一、简介

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

    二、a标签下载

    下载

    三、window.open下载

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

    四、location.href

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

    五、saveAs

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

    六、loadFileSimply

    6.1、loadFileSimply

    1. // loadFileOps.js
    2. import axiosOps from 'axios';
    3. import cookie from 'js-cookie';
    4. import { hasIn } from 'lodash';
    5. import Vue from 'vue';
    6. export const $loadFileSimply = param => {
    7. let token = cookie.get('token');
    8. let tenantId = cookie.get('tenantId');
    9. param.url += param.url.indexOf('?') > -1 ? '&' : '?';
    10. param.url += `tenantId=${tenantId}&_=${new Date().getTime()}`;
    11. return new Promise((resolve, reject) => {
    12. axiosOps({
    13. url: param.url,
    14. method: param.method,
    15. data: param.data,
    16. params: param.params,
    17. responseType: 'arraybuffer', // 请求成功时,后端返回文件流,正常导出文件;
    18. headers: {
    19. Authorization: `Bearer ${token}`,
    20. tenantId: tenantId
    21. },
    22. timeout: param.timeout ? param.timeout : 5000
    23. })
    24. .then(res => {
    25. resolve(res.data);
    26. })
    27. .catch(err => {
    28. Vue.$notify.error({
    29. title: '错误提示',
    30. message: '下载文件失败'
    31. });
    32. reject(err)
    33. });
    34. });
    35. };

    6.2、fileDownload

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

    6.3、使用

    1. import { $loadFileSimply } from '@const/loadFileOps';
    2. import { fileDownload } from '@const/utils.js';
    3. downloadTemple() {
    4. $loadFileSimply({
    5. url: downloadUrl,
    6. method: 'post',
    7. params: { tempCode: 'SAAS_PUR_ORDER_TEMP' },
    8. })
    9. .then((res) => {
    10. fileDownload(res, '文件名称.xlsx'); // 下载并修改文件名
    11. })
    12. .catch(() => {
    13. this.$message.error('下载模板失败!');
    14. });
    15. },

    七、url下载

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

    八、多文件下载

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

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

    十、参考链接:

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

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

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

  • 相关阅读:
    c++并发锁的操作
    apple pencil一定要买吗?Ipad电容笔推荐品牌
    C++中的各种函数及用法(2)
    【TypeScript笔记】03 - TS类型声明文件
    IOS硬件模拟定位原理
    彰显个性│github和gitlab之自定义首页样式
    想查询自己的职称情况,竟然没办法
    QSS编辑器QssEditor之一:简介
    搭建个人知识付费应用系统-(6)Sanity 集成
    MySQL报错:unknown collation: ‘utf8mb4_0900_ai_ci‘
  • 原文地址:https://blog.csdn.net/snowball_li/article/details/126657300