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

通过iframe下载文件,怎么判断文件是否下载成功?

文章目录

    • 概要
    • 问题思考
    • 问题解决方案
    • 技术细节
    • 小结

概要

最近在客户现场开发,碰到客户反馈一个问题,他用tab去承接下载文件的接口,假如文件不存在,会导致tab页面关闭不了


问题思考

下载接口用tab承接,设计思路就不对

虽然tab页面也是通过iframe嵌套的,但是点击那个tab页面的关闭按钮时,会导致tab组件关闭事件里面报错,导致关闭不了。


问题解决方案

新创建一个iframe来承接下载接口,通过iframe加载完成的状态来控制即可。

// 假设 downloadPageUrl 是下载页面的 URL
let downloadPageUrl = "https://example.com/download";// 创建一个隐藏的 iframe 元素
let hiddenIframe = document.createElement('iframe');
hiddenIframe.style.display = 'none';// 将 iframe 加载到下载页面 URL
hiddenIframe.src = downloadPageUrl;// 将 iframe 添加到页面中
document.body.appendChild(hiddenIframe);//  通过iframe的加载状态进行控制
let iframeDoc = hiddenIframe.contentDocument;
if(iframeDoc &&  (iframeDoc.readyState == 'complete' || iframeDoc.readyState == 'interactive')){console.log("文件存在!");
}else{alert("文件不存在!");
}

技术细节

readyState很重要,下面详细说说。

readyState 属性返回当前文档的状态
语法:document.readyState

  1. UNINITIALIZED:XML 对象被产生,但没有任何文件被加载。
  2. LOADING:加载程序进行中,但文件尚未开始解析。
  3. LOADED:部分的文件已经加载且进行解析,但对象模型尚未生效。
  4. INTERACTIVE:仅对已加载的部分文件有效,在此情况下,对象模型是有效但只读的。
  5. COMPLETED:文件已完全加载,代表加载成功。

小结

最终通过上述方案解决了客户的问题,做下总结,方便以后遇到可快速解决。

相关文章:

  • Linux minfo命令教程:详解MS-DOS文件系统参数查看命令(附实例详解和注意事项)
  • 阿里云k8s环境下,因slb限额导致的发布事故
  • 云服务器操作系统如果不小心被删除了文件,那岂不是不能进系统了?
  • Spring Boot启动流程详解
  • Java后端 - 一面凉经 - 得物(国际电商)
  • 安装sqlserver2022最新版只能使用.\SQLEXPRESS登录数据库怎么修改成.
  • Java实战:Spring Boot整合Canal与RabbitMQ实时监听数据库变更并高效处理
  • 2023年第三届中国高校大数据挑战赛(第二场)A题思路
  • EVE-NG桥接虚拟网卡实现与虚拟机通讯
  • RESTful接口规范参考
  • vue element plus Avatar 头像
  • 扼杀网络中的环路:STP、RSTP、MSTP
  • 万界星空科技MES系统中的车间管理的作用
  • 矩阵键盘中为什么有键位并联二极管?
  • Python光速入门 - Flask轻量级框架
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • #Java异常处理
  • [Vue CLI 3] 配置解析之 css.extract
  • 2019.2.20 c++ 知识梳理
  • cookie和session
  • GitUp, 你不可错过的秀外慧中的git工具
  • JavaScript学习总结——原型
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • OSS Web直传 (文件图片)
  • Python_网络编程
  • Spring Boot MyBatis配置多种数据库
  • 安装python包到指定虚拟环境
  • 测试如何在敏捷团队中工作?
  • 分布式熔断降级平台aegis
  • 前端知识点整理(待续)
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 用 Swift 编写面向协议的视图
  • ​如何在iOS手机上查看应用日志
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (一)Dubbo快速入门、介绍、使用
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET delegate 委托 、 Event 事件
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • [ 转载 ] SharePoint 资料
  • []利用定点式具实现:文件读取,完成不同进制之间的
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [ai笔记3] ai春晚观后感-谈谈ai与艺术
  • [ASP.NET 控件实作 Day7] 设定工具箱的控件图标
  • [Design Pattern] 工厂方法模式
  • [Docker]三.Docker 部署nginx,以及映射端口,挂载数据卷
  • [element-ui] el-dialog 中的内容没有预先加载,因此无法获得内部元素的ref 的解决方案
  • [EULAR文摘] 脊柱放射学持续进展是否显著影响关节功能