实现ASP.NET无刷新下载并提示下载完成的开发思路
先给大家贴代码了,后面给大家在做具体的文字说明。
以下是前端代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="WebApplication1.WebForm2" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <script src="Scripts/jquery-1.8.2.js"></script> <script type="text/javascript"> $(function () { $("#btnDownLoad").on("click", function () { var $loading = $("#loadingbox"); var downId = new Date().getTime() + "-" + Math.random(); $loading.css("display", "block"); DownLoad($("#downfile").val(), downId); var tid=setInterval(function () { $.post("WebForm2.aspx", { getresult: "Y", downid: downId }, function (result) { //document.writeln("result:" + result); if(result=="Y") { clearInterval(tid); $loading.css("display", "none"); alert("下载完成!"); } }); }, 3000); }); function DownLoad(filename,downid) { var $form = $("<form target='' method='post' action='WebForm2.aspx'></form>"); $form.append("<input type='hidden' name='filename' value='" + filename + "'>"); $form.append("<input type='hidden' name='downid' value='" + downid + "'>"); $('body').append($form); $form.submit(); } }); </script> </head> <body>
要下载的文件名:<input type="text" id="downfile" />
<input type="button" id="btnDownLoad" value="无刷新下载文件" /> <div id="loadingbox" style="display:none;"> 正加下载中,请稍候。。。 </div> </body> </html>
以下是服务器端代码:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.IO; namespace WebApplication1 { public partial class WebForm2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (Request.HttpMethod == "POST") { string getresult = Request.Form["getresult"]; string downId=Request.Form["downid"]; string cacheKey =string.Format("downloadcompleted-{0}-{1}",downId,Request.UserHostAddress); if (getresult == "Y") //判断是否为获取下载结果的请求 { string result = (Cache[cacheKey] ?? "N").ToString(); Response.Clear(); Response.Write(result); if(result=="Y") //如果查询到下载完成,则应清除标记下载完成的CACHE { Cache.Remove(cacheKey); } Response.End(); return; } string fileName = Request.Form["filename"]; string localFilePath = Server.MapPath("~/" + fileName); System.IO.FileInfo file = new System.IO.FileInfo(localFilePath); Response.Clear(); Response.ClearHeaders(); Response.Buffer = false; Response.AddHeader("Content-Disposition", "attachment;filename=" + file.Name); Response.AddHeader("Content-Length", file.Length.ToString()); Response.ContentType = "application/octet-stream"; Response.WriteFile(file.FullName); Response.Flush(); Cache.Insert(cacheKey, "Y");//输出所有文件数据后,添加CACHE,并设置downloadcompleted=Y,供页面查询结果使用 Response.End(); } } } }
实现原理:前端通过动态创建FORM用来请求下载的资源,请求参数中必需包含一个downId(我这里还包含了一个要下载的文件名),这个是与服务器端的cache Key相对应的,服务器端接收到下载请求后,会获取下载的文件名及downId,然后依据downId生成一个相对应的cache Key用于标识下载结果,再依据下载文件名获取服务器的文件资源并响应输出文件流供客户端下载,输出完毕后,生成一个Cache,并标记为Y,表明已输出完毕。客户端在下载文件的同时,会每隔3秒请求服务器获取下载完成的Cache标识,若获取到其值为Y,则表明下载完成,服务器立即清除该Cache,客户端作出相应的响应(比如:关闭提示下载的对话框及弹出下载完成的对话框)
效果如下:
经过多个不同的浏览器及大文件压力测试,兼容性良好,都能正常下载并能收到下载完成提示,基于以上原理,可以实现进度条显示,实现原理简述:客户端请求服务器下载资源-->服务器响应并按字节分段依次输出,每次输出时生成CACHE,并保存输出进度,直至全部输出完毕,客户端在请求服务器下载资源的同时,也需要同时每隔几秒请求查询服务器下载进度,直至下载进度为100%停止请求。也可利用HTML5新特性WEBSOCKET技术来实现。
- JQuery实现Repeater无刷新批量删除(附后台asp.net源码)
- asp.net 30分钟掌握无刷新 Repeater
- asp.net ajax实现无刷新验证码
- Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)
- 在ASP.NET中下载文件的实现代码
- Asp.Net Mvc2 增删改查DEMO附下载
- asp.net 简便无刷新文件上传系统
- asp.net jquery无刷新分页插件(jquery.pagination.js)
- asp.net生成Excel并导出下载五种实现方法
- asp.net+jquery ajax无刷新登录的实现方法
- Asp.Net 无刷新文件上传并显示进度条的实现方法及思路
- asp.net使用npoi读取excel模板并导出下载详解
- asp.net中利用Jquery+Ajax+Json实现无刷新分页的实例代码
- Asp.net实现MVC处理文件的上传下载功能实例教程
- asp.net中Timer无刷新定时器的实现方法
- ASP.NET批量下载文件的方法
- Asp.net获取服务器指定文件夹目录文件并提供下载的方法
相关文章
详解C#中Dictionary<TKey,TValue>的存储结构
无论是实际的项目中,还是在我们学习的过程中,都会重点的应用到Dictionary<TKey, TValue>这个存储类型,所以本文就来为大家介绍一下这一存储结构的相关知识,希望对大家有所帮助2023-11-11C# 6.0 内插字符串(Interpolated Strings )的使用方法
这篇文章主要为大家详细介绍了C# 6.0 内插字符串的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2018-11-11C# Entity Framework中的IQueryable和IQueryProvider详解
这篇文章主要介绍了C# Entity Framework中的IQueryable和IQueryProvider详解,本文使用实例分析这两个接口的内部实现,需要的朋友可以参考下2015-01-01C#利用iTextSharp组件给PDF文档添加图片/文字水印
这篇文章主要给大家介绍了关于如何C#利用iTextSharp组件给PDF文档添加图片/文字水印的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-10-10
最新评论