实现ASP.NET无刷新下载并提示下载完成

简介:

先上代码,后面再进行说明。

以下是前端代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<%@ 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 >

以下是服务器端代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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技术来实现。

本文转自 梦在旅途 博客园博客,原文链接: http://www.cnblogs.com/zuowj/p/4870014.html ,如需转载请自行联系原作者

相关文章
|
3月前
|
SQL 开发框架 前端开发
分享24个上传下载 和32个社区论坛ASP.NET源码,总有一款适合您
分享24个上传下载 和32个社区论坛ASP.NET源码,总有一款适合您
20 0
|
9月前
|
存储 前端开发 API
30分钟玩转Net MVC 基于WebUploader的大文件分片上传、断网续传、秒传(文末附带demo下载)
30分钟玩转Net MVC 基于WebUploader的大文件分片上传、断网续传、秒传(文末附带demo下载)
30分钟玩转Net MVC 基于WebUploader的大文件分片上传、断网续传、秒传(文末附带demo下载)
|
2天前
|
存储 移动开发 前端开发
对象存储oss使用问题之OSS SDK .net 使用下载例程报错如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
18 0
|
6月前
|
Windows
​史上最详细的Windows10系统离线安装.NET Framework 3.5的方法(附离线安装包下载)
​史上最详细的Windows10系统离线安装.NET Framework 3.5的方法(附离线安装包下载)
544 0
|
2月前
|
安全 C# 开发者
.NET开源的一键自动化下载、安装、激活Microsoft Office利器
.NET开源的一键自动化下载、安装、激活Microsoft Office利器
|
7月前
|
Apache
基于commons-net实现ftp创建文件夹、上传、下载功能.
基于commons-net实现ftp创建文件夹、上传、下载功能.
106 0
|
9月前
|
移动开发 监控 网络协议
基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)
基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)
|
9月前
|
API
.NET指定图片地址下载并转换Base64字符串
.NET指定图片地址下载并转换Base64字符串
|
9月前
|
数据库 C#
C#,.net,winform导入Excel功能以及下载Excel文件到本地,并使用SqlBulkCopy把DataTable类型的数据写入到sqlserver数据库中
C#,.net,winform导入Excel功能以及下载Excel文件到本地,并使用SqlBulkCopy把DataTable类型的数据写入到sqlserver数据库中
208 0
|
9月前
|
前端开发 C#
C# Net MVC 大文件下载几种方式、支持速度限制、资源占用小
C# Net MVC 大文件下载几种方式、支持速度限制、资源占用小