下载文件时遮罩层示例。

新需求是在原来的代码上进行优化查询。

优化完成之后导出功能还是需要1~3秒响应时间,毕竟数据量大,业务逻辑也较为复杂。

为了避免用户重复点击“导出”按钮,故写个遮罩层来示意用户当前正在发送下载的请求。

点击导出或下载按钮弹出遮罩层,由于无法判断文件什么时候在后台读取完,遮罩层什么时候消失成了关键.

思路是这样的:

  在请求到后台下载的Servlet时,往Session中setAttribute一个值。

  前台页面写个定时器,不断请求另外一个Servlet获取Session中set的值,当值为空字符串(当然你也可以自己把握)往页面out.print(Json)发送Json对象。

  页面通过返回的json对象隐藏 遮罩层。

$(‘#submitBtn‘).on(‘click‘,function(){
        shadeLayer();  // 弹出遮罩层

	window.location.href = ‘downServlet?filename=download.jpg&shadeKey=shadeLayer&shadeValue=‘ + new Date().getTime();

	var count = 0;

	var timer = setTimeout(function(){
		$.post(‘getShadeKey?shadeKey=shadeLayer‘, null, function(res){
			flag = res && res.shade;
			count = res && res.flag === false ? count+1 : 0;
		});		

		if(flag && count < 3){  // 生产环境上集群了服务器,极端情况下读取不到参数,容错处理.
			timer = setTimeout(arguments.callee, 1000);
		} else {
			$(‘#layer‘).hide();
		}
	}, 1000);			

});
// Servlet 关键代码。
// session 键集合
Enumeration<String> enumeration = session.getAttributeNames();

boolean flag = false;
// 迭代 session 键
while(enumeration.hasMoreElements()){
  if(enumeration.nextElement().equalsIgnoreCase(shadeKey)){
        flag = true;
   }
}

String shade = (String)session.getAttribute(shadeKey);
Shade sd = null; 

if(flag && shade != null && shade.isEmpty()){
    sd = new Shade(flag, shade);
    out.print(GSONUtil.getGsonStr(sd));
    request.getSession().removeAttribute(shadeKey); //一轮下载完毕 删除 shadeKey键。
}
else {
    sd = new Shade(flag, String.valueOf(new Date().getTime()));
    out.print(GSONUtil.getGsonStr(sd));
}        

out.close();
时间: 2024-08-13 16:51:02

下载文件时遮罩层示例。的相关文章

正确处理下载文件时HTTP头的编码问题(Content-Disposition)

转自:https://blog.robotshell.org/2012/deal-with-http-header-encoding-for-file-download/ 最近在做项目时遇到了一个 case :需要实现一个强制下载功能(即强制弹出下载对话框,阻止浏览器尝试解析显示某些文件格式),并且文件名必须保持和用户之前上传时相同(可能包含非 ASCII 字符). 前一个需求很容易实现:使用 HTTP Header 的 Content-Disposition: attachment 即可,还可

【转】正确处理浏览器在下载文件时HTTP头的编码问题(Content-Disposition)

最近在做项目时遇到了一个 case :需要实现一个强制在浏览器中的下载功能(即强制让浏览器弹出下载对话框),并且文件名必须保持和用户之前上传时相同(可能包含非 ASCII 字符). 前一个需求很容易实现:使用 HTTP Header 的 Content-Disposition: attachment 即可,还可以配合 Content-Type: application/octet-stream 来确保万无一失.而后一个需求就比较蛋疼了,牵扯到 Header 的编码问题(文件名是作为 filena

实现在 .net 中使用 HttpClient 下载文件时显示进度

原文:实现在 .net 中使用 HttpClient 下载文件时显示进度 在 .net framework 中,要实现下载文件并显示进度的话,最简单的做法是使用 WebClient 类.订阅 DownloadProgressChanged 事件就行了. 但是很可惜,WebClient 并不包含在 .net standard 当中.在 .net standard 中,要进行 http 网络请求,我们用得更多的是 HttpClient.另外还要注意的是,UWP 中也有一个 HttpClient,虽然

[ASP.NET][C#]下载文件时中文文件名出现乱码

负责的网站在ASP.NET网页有一段下载Word/Excel文件的程序,最近使用者要求的文件名称内含繁体中文字, 同事用chrome/firefox浏览器测试下载都很正常显示,但用IE(版本11)开启时,却出现了乱码. 1.准备一个中文文件名的文件 ASP.NET MVC 2.在HomeControler中加入下载程序Download public ActionResult Download() { //文件位置 string filepath = @"E:testWebApplication1

浏览器下载文件时一共发送2次请求,如何把“下载次数”只记录为1次?

最近,个人官网实现了PDF下载功能,出于统计的考虑,增加了"下载次数"download_count这个字段. 但是,我今天突然发现,每次下载download_count都直接+2了.如果服务器发生这种事,还有一定的可能,本地就我一个人下载,怎么可能下载2次.于是,打开了log4j的debug模式,果然执行了2次更新请求. @RequestMapping(value = "/download/pdf") public void downloadPdf(@Request

基于Android 下载文件时,更新UI简单帮助类

由于在项目开发时,有这样的简单需求,问谷歌,网络上也有好多Utils工具类,但是比较冗余.自己就简单的写了一个简单帮助类. /** * 下载文件,更新UI简单帮助类 * * @author jarlen * */ public class DownLoadHelper { private static final int DOWN_BEGIN = 0; private static final int DOWN_UPDATA = 1; private static final int DOWN_

PHP 下载文件时自动添加bom头的方法

首先弄清楚,什么是bom头?在Windows下用记事本之类的程序将文本文件保存为UTF-8格式时,记事本会在文件头前面加上几个不可见的字符(EF BB BF),就是所谓的BOM(Byte order Mark).不仅限于 记事本保存的文件,只要在文件的开口包含了EF BB BF 几个不可见的字符(十六进制应该是是xEFxBBxBF,用二进制编辑文件可见).这像是一个约定俗成的东西,当系统看到这玩意的时候,就会觉得你这个文件是UTF-8编码的. 如果你的接口是UTF-8的,你需要强制下载一个文件,

解决SharePoint下载文件时自动修改扩展名的问题

今天,有人告诉了我一个有趣的问题.当用户将一个扩展名为.ai的文件(Adobe illustrator格式的文件)上载到SharePoint 2013文档库中之后,点击它下载时,下载提示栏所显示的文件名的扩展名,却被修改为了.ps. ? ? 这是一个挺有意思的问题.要解决它,请按照下面的步骤在SharePoint服务器上进行配置即可. ? 第一步:让SharePoint识别.ai文件 ? 嗯,实际上,第一步对于解决上面所说的问题,并不是必需的,你完全可以直接跳到第二步.但是这个步骤可以让Shar

下载文件时文件名是中文,文件名丢失或者乱码的问题

解决方案 针对不同浏览器类型,对文件名字做编码处理 Firefox (Base64) :IE.Chrome ... 使用的是URLEncoder public class DownloadServlet2 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取文