前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何知道iframe文件下载download完成

如何知道iframe文件下载download完成

作者头像
Tiffany_c4df
发布于 2019-09-04 07:27:30
发布于 2019-09-04 07:27:30
8.7K00
代码可运行
举报
文章被收录于专栏:前端小课堂前端小课堂
运行总次数:0
代码可运行

如何知道iframe文件下载download完成 author: @TiffanysBear

问题

当使用iframe作为文件下载的载体时,如何知道文件已经下载完毕。现有的iframe的onLoad方法具有兼容性问题,在chrome、IE下无法监听onLoad事件监听文件下载完毕,因为onLoad事件本身也是对iframe中的html结构的加载进度监听。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var url = 'http://www.example.com/file.zip';
var iframe = document.createElement('iframe');
iframe.src = url;
iframe.style.display = 'none';
iframe.onload = function() {
    console.debug('start downloading...');
    document.body.removeAttribute(iframe);
}
document.body.appendChild(iframe);

当chrome、IE下时,如果HTTP文件头中包含Content-disposition: attachment;即下载文件的链接的话,不会触发这个事件onLoad事件。

这里说一下Content-disposition:

Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。Content-disposition其实可以控制用户请求所得的内容存为一个文件的时候提供一个默认的文件名,文件直接在浏览器上显示或者在访问时弹出文件下载对话框。 Content-Disposition为属性名disposition-type是以什么方式下载,如attachment为以附件方式下载disposition-parm为默认保存时的文件名服务端向客户端游览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器打开,比如txt、jpg等,会直接在浏览器中显示 注意事项: 1.当代码里面使用Content-Disposition来确保浏览器弹出下载对话框的时候。 response.addHeader(‘Content-Disposition’, ‘attachment’);一定要确保没有做过关于禁止浏览器缓存的操作。 代码如下: response.setHeader(‘Pragma’, ‘No-cache’); response.setHeader(‘Cache-Control’, ‘No-cache’); response.setDateHeader(‘Expires’, 0); 不然会发现下载功能在opera和firefox里面好好的没问题,在IE下面就是不行

解决思路一:利用cookie

后端将文件下载进度放在cookie中,通过轮询cookie的方式,对文件下载进度进行获取,判断文件是否已经下载完毕。 缺陷: 1、需要后端配合 2、如果客户端禁用了cookie,则该方案完全失效;在无痕浏览模式下,读取cookie,甚至代码报错。

解决思路二:添加header配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 不让浏览器自动检测文件类型
// 说明资料:http://drops.wooyun.org/tips/1166
response.addHeader('X-Content-Type-Options', 'nosniff');
// 提示浏览器不让其在frame或iframe中加载资源的文件内容
// https://developer.mozilla.org/zh-CN/docs/Web/HTTP/X-Frame-Options
response.addHeader('X-Frame-Options', 'deny');

但是在chorome v58版本将header的X-Frame-Options设为deny会报错。并且下载的时候网络连接会出现失败。

解决思路三:轮询监听readyState

定时器轮询监听readyState的状态,如果是 complete 或者 interactive 说明文件加载完成。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var timer = setInterval(function () {
    iframe = document.getElementById('iframedownload');
    var iframeDoc = iframe.contentDocument || iframe.contentWindow.document;
    // Check if loading is complete
    if (iframeDoc.readyState == 'complete' || iframeDoc.readyState == 'interactive') {
        loadingOff();
        clearInterval(timer);
        return;
    }
}, 4000);

该种方法比较好,因为不需要后端进行配合,且不依赖与cookie等变量带来的问题,且能实现我们的需求。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java 如何实现大文件上传下载(传输)各种格式「建议收藏」
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。
全栈程序员站长
2022/09/06
2.7K0
java 如何实现大文件上传下载(传输)各种格式「建议收藏」
Response.AddHeader「建议收藏」
Response.AddHeader(“content-type”,”application/x-msdownload”);   
全栈程序员站长
2022/09/07
2350
前端文件下载(三)
两篇文章讲解的都是自动启动浏览器下载。下载的进度浏览器进行反馈,文件小的时候浏览器会很快下载完并提示,但是文件很大的话,那么下载就很慢了,准确来说数据拉取很慢,点击之后页面很久才会响应。这个时候,我们加个 loading 转圈圈提示就行了,但是不友好,是否让用户知道数据加载到哪里了呢?加载完后浏览器吊起下载。
Jimmy_is_jimmy
2023/09/19
4680
前端文件下载(三)
JSP文件下载及getOutputStream() has already been的解决 JSPWeblogicExcelWeb.net
JSP文件下载及出现getOutputStream() has already been called for this response的解决方法 http://iamin.blogdriver.com/iamin/1072546.html
阿敏总司令
2019/02/28
1.7K0
ASP.NET 大文件下载实现代码
文件下载是一个网站最基本的功能,ASP.NET网站的文件下载功能实现也很简单,但是如果遇到大文件的下载而不做特殊处理的话,那将会出现不可预料的后果。本文就基于ASP.NET提供大文件下载的实现思路及代码。
用户8671053
2021/11/02
1.9K0
asp.net mvc实现文件下载「建议收藏」
前段时间一直对如何解决文件下载的问题比较困惑,对文件下载的问题一直都是用的前端的方式解决的,代码如下
全栈程序员站长
2022/09/15
1.8K0
【springboot2.x】实现文件下载
简写了几种下载日志的方法。一、方法一 @ApiOperation("日志下载") @GetMapping("/logDownload") public void download(HttpServletResponse response) { try { String mulu = "d:/logs"; ZipUtil.zip(mulu); String path = "d:/logs.zip";
无敌小菜鸟
2023/02/16
8860
Java下载文件的几种方式
以流的方式下载 public HttpServletResponse download(String path, HttpServletResponse response) { try { // path是指欲下载的文件的路径。 File file = new File(path); // 取得文件名。 String filename = file.getName(); /
一觉睡到小时候
2019/09/17
4.1K0
asp.net下载文件几种方式
{ /* 微软为Response对象提供了一个新的方法TransmitFile来解决使用Response.BinaryWrite 下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题。 代码如下: */ Response.ContentType = "application/x-zip-compressed"; Response.AddHeader("Content-Disposition", "attachment;filename=z.zip"); string filename = Server.MapPath("DownLoad/aaa.zip"); Response.TransmitFile(filename); } //WriteFile实现下载 protected void Button2_Click(object sender, EventArgs e) { /* using System.IO; */ string fileName ="aaa.zip";//客户端保存的文件名 string filePath=Server.MapPath("DownLoad/aaa.zip");//路径 FileInfo fileInfo = new FileInfo(filePath); Response.Clear(); Response.ClearContent(); Response.ClearHeaders(); Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName); Response.AddHeader("Content-Length", fileInfo.Length.ToString()); Response.AddHeader("Content-Transfer-Encoding", "binary"); Response.ContentType = "application/octet-stream"; Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312"); Response.WriteFile(fileInfo.FullName); Response.Flush(); Response.End(); } //WriteFile分块下载 protected void Button3_Click(object sender, EventArgs e) { string fileName = "aaa.zip";//客户端保存的文件名 string filePath = Server.MapPath("DownLoad/aaa.zip");//路径 System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath); if (fileInfo.Exists == true) { const long ChunkSize = 102400;//100K 每次读取文件,只读取100K,这样可以缓解服务器的压力 byte[] buffer = new byte[ChunkSize]; Response.Clear(); System.IO.FileStream iStream = System.IO.File.OpenRead(filePath); long dataLengthToRead = iStream.Length;//获取下载的文件总大小 Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName)); while (dataLengthToRead > 0 && Response.IsClientConnected) { int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小 Response.OutputStream.Write(buffer, 0, lengthRead); Response.Flush(); dataLengthToRead = dataLengthToRead - lengthRead; } Response.Close(); } } //流方式下载 protected void Button4_Click(object sender, Eve
用户7705674
2021/11/02
2K0
Spring MVC 4 文件下载实例(带源码)
【本系列其他教程正在陆续翻译中,点击分类:spring 4 mvc 进行查看。源码下载地址在文章末尾。】
明明如月学长
2021/08/27
8400
spring boot 下载excel文件提示“文件中部分内容有问题。是否让我们尽量尝试恢复
项目场景: Springboot项目通过IO流写出excel模板文件, 浏览器下载文件并在office 2016 打开后. 出现 文件中部分内容有问题。是否让我们尽量尝试恢复? 如果您信任此工作簿的源
时间静止不是简史
2023/03/16
2.4K0
spring boot 下载excel文件提示“文件中部分内容有问题。是否让我们尽量尝试恢复
Java 文件下载案例讲解
文件下载是Web应用程序中常见的功能之一。它允许用户从Web服务器上下载文件,例如文档、图片、音频、视频等。在本文中,我们将详细解释如何在Java Web应用程序中实现文件下载功能。我们将提供示例代码和逐步说明,以帮助您理解和实现这一功能。
繁依Fanyi
2023/11/04
4400
ASP.netMVC文件下载
string filePath = Server.MapPath(“”);//路径
全栈程序员站长
2022/09/18
5950
JavaWeb——ServletContext对象的使用及文件下载案例实战
ServletContext代表整个web应用,可以和程序的容器(服务器)来通信,功能如下:
Winter_world
2020/09/25
5670
JavaWeb——ServletContext对象的使用及文件下载案例实战
GridFs文件上传下载
文章目录[隐藏] 业务层 上传 下载 预览 配置文件 业务层 public class FileMonService { /** * 操作GridFs接口 */ private final GridFsTemplate gridFsTemplate; @Autowired public FileMonService(GridFsTemplate gridFsTemplate) { this.gridFsTemplate = grid
用户10325771
2023/03/01
5540
Web阶段:第十五章:文件上传&下载
文件的上传 1、首先需要一个form表单 2、然后在表单内有input type=”file” 3、提交的方式必须是method=”POST” 4、enctype="multipart/form-data"编码类型必须是多段的表单数据
Java廖志伟
2022/09/28
3430
Web阶段:第十五章:文件上传&下载
22. Servlet入门 - 文件下载案例
说白了就是把服务器端的文件拷贝一份到客户端, 文件的拷贝---> 流(输入流和输出流)的拷贝
Devops海洋的渔夫
2021/11/12
4040
22. Servlet入门 - 文件下载案例
servlet实现文件下载功能
第二步:写servlet(DownloadServlet.java) packagecom.example.servlet; importjava.io.File; importjava.io.IOE
Java学习
2018/04/18
1.1K0
servlet实现文件下载功能
文件下载实现
实现文件下载步骤 1.获取要下载的文件名 2.读取要下载的文件内容 3.把下载的文件内容返回给客户 4.在回传前,通过响应头告诉客户端返回的数据类型 5.通过响应头告诉客户端收到的数据是要下载的 具体实现 导入 commons-io-1.4.jar包 编写Servlet程序 public class FileUpload extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServl
切图仔
2022/09/14
7530
Java Web文件下载功能实现
但是这里会出现一个问题,就是单击下载压缩包的时候会弹出下载页面,但是下载图片的时候浏览器就直接打开了图片,没有下载。
Java团长
2018/08/03
2.6K0
相关推荐
java 如何实现大文件上传下载(传输)各种格式「建议收藏」
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验