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

前端下载文件时浏览器右上角没有保存弹窗及显示进度,下载完之后才会显示保存弹窗的问题定位及解决方案

需求背景

在开发过程中会发现,有的时候下载后端返回的文件,浏览器右上角不会进行保存弹窗的弹出及下载进度,而是接口响应后文件下载完才会弹出保存并且没有进度条效果,这就导致在点击下载后用户是不知道文件下载到什么进度了,当然可以使用 onUploadProgress监听接口的进度去做一个进度条,但是会导致ui的差异

问题定位

对比代码差异,发现不同点为一个是后端返回的下载路径,一个是文件流,这就导致其实在下载的时候是有差异的,一个是直接通过a标签进行下载,一个是通过xmlhttprequest的方式,浏览器不会对xmlhttprequest的方式的下载进行进度的一个处理

解决方式

1.直接 window.location.href=‘域名+接口’ 的方式进行下载,但是这种方式会存在接口报错的话会直接打开浏览器的报错页面,跨域、文件名也没有办法进行设置,文件过大浏览器崩掉

2.文件上传oss或者cdn,后端返回下载地址前端进行下载,但是我们公司没有合作商并且文件是存在服务器磁盘里所以放弃这个方案

3.nginx做映射服务器文件,前端拼接域名及接口进行a.download下载

实现过程

 const DownloadItemClick = (e: Number) => {
    let filePath = DocumentList[e].filePath;
    const fullOrigin = window.location.origin;
    let url = '';
    //判断是否为本地 本地的话拼接dev的域名  这是示例所以我直接用includes判断了 实际过程中最好建立本地、测试、生产的三个env文件在里面去配置
    if (fullOrigin.includes('localhost')) {
      url = 'https://dev-website.7x-networks.net/file/download/' + filePath;
    } else {
      url = fullOrigin + '/file/download/' + filePath;
    }

    const a = document.createElement('a'); // 创建链接元素
    a.style.display = 'none'; // 隐藏链接
    a.href = url; // 设置链接的 href
    a.download = `${DocumentList[e].originalFileName}`; // 设置下载文件的文件名
    document.body.appendChild(a); // 将链接添加到 DOM
    a.click(); // 程序化点击链接
    document.body.removeChild(a); // 从 DOM 中移除链接
  };

注:因为本地访问的是dev的域名 所以导致本地启动项目后下载文件的时候文件名是不对的 并没有使用后端在响应头里面返回的文件名  测试和生产为同一个域名不会存在这种问题

相关文章:

  • PHP 拆词搜索(常用于搜索内容)
  • 从三次方程到复平面:复数概念的奇妙演进(一)
  • 多光谱相机:海洋管道漏油(溢油)监测
  • 2025蓝桥杯C++ A组省赛 题解
  • 用Python构建区块链身份认证:安全与信任的新篇章
  • ZYNQ笔记(七):程序固化(QSPI Flash)
  • OpenSSH版本的重大升级 :OpenSSH 10
  • 推流265视频,网页如何支持显示265的webrtc
  • [特殊字符] Hyperlane:为现代Web服务打造的高性能Rust文件上传解决方案
  • 天梯赛L2题目算法汇总(记录高频考点)
  • 智能指针之设计模式2
  • 笔试专题(八)
  • Python 的 collections 模块
  • 【Excel】数据透视表月度数据排序不正确
  • 智能座舱测试用例编写
  • MCU开发主要是项目移植吗?
  • 基于SiamFC的红外目标跟踪
  • java 多租户的产品设计思路
  • HCIP第十三天
  • leetcode 718 最长公共子数组
  • 高龄老人骨折后,生死可能就在家属一念之间
  • 第三届“老山国际春茶节”活动在云南麻栗坡举办
  • 巴总理召开国家指挥当局紧急会议
  • 要更加冷静地看待“东升西降”的判断
  • 新买宝马竟是“维修车”,男子发视频维权被4S店索赔100万
  • 最快3天开通一条定制公交线路!上海推出服务平台更快响应市民需求