Asp.net 实现断点续传 下载大文件
2010-04-28 14:52
375 查看
**//// <summary>
x _0O%f+K)B5D /// 支持断点续传的下载大文件的函数 中博IT教育网4P z/2b,h-q `
/// </summary>
_;B$A.} S8E#@ D I /// <param name="downloadFilePath">被下载文件的路径,相对和绝对都可以</param>
K I g(h { D V /// <param name="showFileName">显示给用户的文件名,可以为空</param>
.p9a1X j;[ /// <param name="fileType">要下载的文件类型,如果不确定,请留空</param>
E `6G5F L n(y y / /// <remarks>用于大文件的下载</remarks>
;h1i'^+Q t T P5w F j5a public static void BigFileDownload(string downloadFilePath, string showFileName, string fileType) 中博IT教育网3r @$f"W y
{ 中博IT教育网)m t J L b I3S [4s W p
downloadFilePath = downloadFilePath.Trim();
6u D0/)h E l ^ _ p P e i if(string.Empty == downloadFilePath) 中博IT教育网%on4^"] t n%E b
ShowErrorMessage("没有指定要下载的文件路径!");
1l4t [$g ]3d/y8c
1b2M t9h{ x o8[8N b if(downloadFilePath.IndexOf(":") < 0)
D(o I*W m downloadFilePath = System.Web.HttpContext.Current.Server.MapPath(downloadFilePath);
y K z b7^7i;y f D,w.b
(t e {'X5C.Z S m E showFileName = showFileName.Trim();
#I f _ s)H/D if(string.Empty == showFileName) 中博IT教育网 J S m;@;P)~
showFileName = Path.GetFileName(downloadFilePath);
9R9E N f m+v:} Z N
n:| w h(z Q ]*D s showFileName = System.Web.HttpUtility.UrlEncode(System.Web.HttpContext.Current.Request.ContentEncoding.GetBytes(showFileName)); 中博IT教育网 A A c F-x*j
中博IT教育网 z j g q g K1/;Y H A
fileType = fileType.Trim(); 中博IT教育网 y T2I${ g%Q D
if(string.Empty == fileType)
'~ Y m k Y W f fileType = "application/octet-stream";
R c d u8l#U h M o J 中博IT教育网-l B:^ X { p
System.Web.HttpContext.Current.Response.Clear(); 中博IT教育网 M V)~ @ X z"] l ` g X
Stream objStream = null; 中博IT教育网$z y(p;V"z e$c"^
byte[] btBuffer = new byte[8192]; // 1024*8 = 8Kb 中博IT教育网1f"[;/ { p.K,J u T T
int intLength = 0;
U#@ X o ` x&I,a)D%V long lngData2Read = 0;
j8q R ~+k;[ i s try 中博IT教育网 o o ` r,P
{
|:v T-q0P J7W!@ using(objStream = new FileStream(downloadFilePath, FileMode.Open, FileAccess.Read, FileShare.Read)) 中博IT教育网G1x g O c } ^ k c
{
q"q eE/^4E e!@ lngData2Read = objStream.Length;
G {+i!r g A,] J 中博IT教育网*x$B&^2P#t T
输出HTTP头信息#region 输出HTTP头信息 中博IT教育网)} ~%`:{ x6`
A o } f$A ~3^ long lngP = 0;
#Y Q;b/x/R s H6Y if(null != System.Web.HttpContext.Current.Request.Headers["Range"])
w&Y F)? J { 中博IT教育网%q S k Q U
System.Web.HttpContext.Current.Response.StatusCode = 206;
#S q+n:M I k8/ lngP = long.Parse(System.Web.HttpContext.Current.Request.Headers["Range"].Replace("bytes=","").Replace("-","")); 中博IT教育网 } W Q9T-Q
}
c.x C I f if(0 != lngP)
C(F#j+W7_ y {
h Z!z _ k m3z"h1Z L s System.Web.HttpContext.Current.Response.AddHeader("Content-Range","bytes " + lngP.ToString() + "-" + ((long)(lngData2Read - 1)).ToString() + "/" + lngData2Read.ToString()); 中博IT教育网 x D/A5F1T
}
hw!^ i:W%] Y0G L System.Web.HttpContext.Current.Response.AddHeader("Content-Length",((long)(lngData2Read - lngP)).ToString());
T ? W1a)C1J/a ~6w
+]!R L3w-J&]+y)`"E System.Web.HttpContext.Current.Response.ContentType = fileType;
k q,k)v Y%}(J System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + showFileName);
$^&I#Y'l K,|
p ? ? l1_.g-O #endregion 中博IT教育网 ? S1X:v:R
中博IT教育网 |7x t3n)X#O
while(lngData2Read > 0) <
4000
span style="display:none;">中博IT教育网 z C f^"p!d!~ y
{ 中博IT教育网 ~ e r y h"w;H
if(HttpContext.Current.Response.IsClientConnected)
(M5K%V c-c / y+C { 中博IT教育网(b M*? k m-G
intLength = objStream.Read(btBuffer, 0, 8192);
/|&o'v%g7/#B o:T @ HttpContext.Current.Response.OutputStream.Write(btBuffer, 0, intLength); 中博IT教育网(U8l v T+|1d
HttpContext.Current.Response.Flush(); 中博IT教育网 _0Q:M w Z | y
lngData2Read -= intLength;
E*qa1D { S$s n J7? ` btBuffer = new byte[8192]; 中博IT教育网,J%s9v'B g5H5V7`(^2l
} 中博IT教育网)L.@ | d+| G
else
)v G d"i N0A { 中博IT教育网 H l u"l K Ed8h n
lngData2Read = -1; 中博IT教育网 f { r bu R }7/$] x
}
A m [ e2P }
[;L#H ] j9j%U } 中博IT教育网0|"@ _ / ?*C n%P;/
} 中博IT教育网$J9h4K q K V$?
catch(Exception ex)
@-Y3b$V1y Q { 中博IT教育网 E6P [#k J { Q g(V
ShowErrorMessage(ex.Message); 中博IT教育网6o8M J.X x X t
} 中博IT教育网/@ k*z W:l
// 结束文件下载,此句不可缺少,否则会把本页的HTML代码一起下载文件里 中博IT教育网-G } j/I4/%b m4~ _
HttpContext.Current.Response.End();
-s l S5t R u / L C/t8D }
r,u A'y ` j Z;_ [ P I 中博IT教育网'^ X D|3O
/**//// <summary>
.L4~f6o K J%t @ /// 输出错误信息给用户,采用客户端弹出框的方式 中博IT教育网 Y9G2F h I R J N W j
/// </summary>
b G,X'E H'f E K)J /// <param name="errorMessage">错误信息的内容</param>
;d7y u/r,u!M r T R internal static void ShowErrorMessage(string errorMessage) 中博IT教育网)G1l.L l b
{
(p/X ^ f E m errorMessage = errorMessage.Replace("", "/""); 中博IT教育网+U(r /4M N r S A&^%e m / c
System.Web.HttpContext.Current.Response.Write("<script language=javascript>");
` C9z8I,s6Z L F System.Web.HttpContext.Current.Response.Write("alert("); 中博IT教育网,` U9w"B t(C
System.Web.HttpContext.Current.Response.Write(errorMessage);
+` K-S(X z$K6g;c Z System.Web.HttpContext.Current.Response.Write(");</script>"); 中博IT教育网 A T1h-/!h;o"S$V |
System.Web.HttpContext.Current.Response.End(); 中博IT教育网 n;T w F%C:[ @r
}
x _0O%f+K)B5D /// 支持断点续传的下载大文件的函数 中博IT教育网4P z/2b,h-q `
/// </summary>
_;B$A.} S8E#@ D I /// <param name="downloadFilePath">被下载文件的路径,相对和绝对都可以</param>
K I g(h { D V /// <param name="showFileName">显示给用户的文件名,可以为空</param>
.p9a1X j;[ /// <param name="fileType">要下载的文件类型,如果不确定,请留空</param>
E `6G5F L n(y y / /// <remarks>用于大文件的下载</remarks>
;h1i'^+Q t T P5w F j5a public static void BigFileDownload(string downloadFilePath, string showFileName, string fileType) 中博IT教育网3r @$f"W y
{ 中博IT教育网)m t J L b I3S [4s W p
downloadFilePath = downloadFilePath.Trim();
6u D0/)h E l ^ _ p P e i if(string.Empty == downloadFilePath) 中博IT教育网%on4^"] t n%E b
ShowErrorMessage("没有指定要下载的文件路径!");
1l4t [$g ]3d/y8c
1b2M t9h{ x o8[8N b if(downloadFilePath.IndexOf(":") < 0)
D(o I*W m downloadFilePath = System.Web.HttpContext.Current.Server.MapPath(downloadFilePath);
y K z b7^7i;y f D,w.b
(t e {'X5C.Z S m E showFileName = showFileName.Trim();
#I f _ s)H/D if(string.Empty == showFileName) 中博IT教育网 J S m;@;P)~
showFileName = Path.GetFileName(downloadFilePath);
9R9E N f m+v:} Z N
n:| w h(z Q ]*D s showFileName = System.Web.HttpUtility.UrlEncode(System.Web.HttpContext.Current.Request.ContentEncoding.GetBytes(showFileName)); 中博IT教育网 A A c F-x*j
中博IT教育网 z j g q g K1/;Y H A
fileType = fileType.Trim(); 中博IT教育网 y T2I${ g%Q D
if(string.Empty == fileType)
'~ Y m k Y W f fileType = "application/octet-stream";
R c d u8l#U h M o J 中博IT教育网-l B:^ X { p
System.Web.HttpContext.Current.Response.Clear(); 中博IT教育网 M V)~ @ X z"] l ` g X
Stream objStream = null; 中博IT教育网$z y(p;V"z e$c"^
byte[] btBuffer = new byte[8192]; // 1024*8 = 8Kb 中博IT教育网1f"[;/ { p.K,J u T T
int intLength = 0;
U#@ X o ` x&I,a)D%V long lngData2Read = 0;
j8q R ~+k;[ i s try 中博IT教育网 o o ` r,P
{
|:v T-q0P J7W!@ using(objStream = new FileStream(downloadFilePath, FileMode.Open, FileAccess.Read, FileShare.Read)) 中博IT教育网G1x g O c } ^ k c
{
q"q eE/^4E e!@ lngData2Read = objStream.Length;
G {+i!r g A,] J 中博IT教育网*x$B&^2P#t T
输出HTTP头信息#region 输出HTTP头信息 中博IT教育网)} ~%`:{ x6`
A o } f$A ~3^ long lngP = 0;
#Y Q;b/x/R s H6Y if(null != System.Web.HttpContext.Current.Request.Headers["Range"])
w&Y F)? J { 中博IT教育网%q S k Q U
System.Web.HttpContext.Current.Response.StatusCode = 206;
#S q+n:M I k8/ lngP = long.Parse(System.Web.HttpContext.Current.Request.Headers["Range"].Replace("bytes=","").Replace("-","")); 中博IT教育网 } W Q9T-Q
}
c.x C I f if(0 != lngP)
C(F#j+W7_ y {
h Z!z _ k m3z"h1Z L s System.Web.HttpContext.Current.Response.AddHeader("Content-Range","bytes " + lngP.ToString() + "-" + ((long)(lngData2Read - 1)).ToString() + "/" + lngData2Read.ToString()); 中博IT教育网 x D/A5F1T
}
hw!^ i:W%] Y0G L System.Web.HttpContext.Current.Response.AddHeader("Content-Length",((long)(lngData2Read - lngP)).ToString());
T ? W1a)C1J/a ~6w
+]!R L3w-J&]+y)`"E System.Web.HttpContext.Current.Response.ContentType = fileType;
k q,k)v Y%}(J System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + showFileName);
$^&I#Y'l K,|
p ? ? l1_.g-O #endregion 中博IT教育网 ? S1X:v:R
中博IT教育网 |7x t3n)X#O
while(lngData2Read > 0) <
4000
span style="display:none;">中博IT教育网 z C f^"p!d!~ y
{ 中博IT教育网 ~ e r y h"w;H
if(HttpContext.Current.Response.IsClientConnected)
(M5K%V c-c / y+C { 中博IT教育网(b M*? k m-G
intLength = objStream.Read(btBuffer, 0, 8192);
/|&o'v%g7/#B o:T @ HttpContext.Current.Response.OutputStream.Write(btBuffer, 0, intLength); 中博IT教育网(U8l v T+|1d
HttpContext.Current.Response.Flush(); 中博IT教育网 _0Q:M w Z | y
lngData2Read -= intLength;
E*qa1D { S$s n J7? ` btBuffer = new byte[8192]; 中博IT教育网,J%s9v'B g5H5V7`(^2l
} 中博IT教育网)L.@ | d+| G
else
)v G d"i N0A { 中博IT教育网 H l u"l K Ed8h n
lngData2Read = -1; 中博IT教育网 f { r bu R }7/$] x
}
A m [ e2P }
[;L#H ] j9j%U } 中博IT教育网0|"@ _ / ?*C n%P;/
} 中博IT教育网$J9h4K q K V$?
catch(Exception ex)
@-Y3b$V1y Q { 中博IT教育网 E6P [#k J { Q g(V
ShowErrorMessage(ex.Message); 中博IT教育网6o8M J.X x X t
} 中博IT教育网/@ k*z W:l
// 结束文件下载,此句不可缺少,否则会把本页的HTML代码一起下载文件里 中博IT教育网-G } j/I4/%b m4~ _
HttpContext.Current.Response.End();
-s l S5t R u / L C/t8D }
r,u A'y ` j Z;_ [ P I 中博IT教育网'^ X D|3O
/**//// <summary>
.L4~f6o K J%t @ /// 输出错误信息给用户,采用客户端弹出框的方式 中博IT教育网 Y9G2F h I R J N W j
/// </summary>
b G,X'E H'f E K)J /// <param name="errorMessage">错误信息的内容</param>
;d7y u/r,u!M r T R internal static void ShowErrorMessage(string errorMessage) 中博IT教育网)G1l.L l b
{
(p/X ^ f E m errorMessage = errorMessage.Replace("", "/""); 中博IT教育网+U(r /4M N r S A&^%e m / c
System.Web.HttpContext.Current.Response.Write("<script language=javascript>");
` C9z8I,s6Z L F System.Web.HttpContext.Current.Response.Write("alert("); 中博IT教育网,` U9w"B t(C
System.Web.HttpContext.Current.Response.Write(errorMessage);
+` K-S(X z$K6g;c Z System.Web.HttpContext.Current.Response.Write(");</script>"); 中博IT教育网 A T1h-/!h;o"S$V |
System.Web.HttpContext.Current.Response.End(); 中博IT教育网 n;T w F%C:[ @r
}
相关文章推荐
- 使文件下载的自定义连接支持 FlashGet 的断点续传多线程链接下载! C#/ASP.Net 实现!
- 使文件下载的自定义连接支持 FlashGet 的断点续传多线程链接下载! C#/ASP.Net 实现!
- 使文件下载的自定义连接支持 FlashGet 的断点续传多线程链接下载! C#/ASP.Net 实现
- 使文件下载的自定义连接支持 FlashGet 的断点续传多线程链接下载! C#/ASP.Net 实现! 转
- 使文件下载的自定义连接支持 FlashGet 的断点续传多线程链接下载! C#/ASP.Net 实现!
- asp.net中下载文件的实现方法
- 在ASP.NET中支持断点续传下载大文件(ZT)源码
- ASP.NET 大文件下载的实现思路及代码
- 实现asp.net的文件压缩、解压、下载
- ASP.NET上传下载文件示例,使用webClient实现
- 2014-07-23 利用ASP.NET自带控件实现单文件上传与下载
- 在ASP.NET中实现压缩多个文件为.zip文件,实现批量下载功能
- Asp.net大文件下载的实现思路及源码
- asp.net中实现文件下载功能
- ASP.NET文件下载各种方式比较:对性能的影响、对大文件的支持、对断点续传和多线程下载的支持
- 拥有网页版小U盘 ASP.NET实现文件上传与下载功能
- ASP.NET上传下载文件,使用TransmitFile方法实现下载。
- 解决Asp.net 实现文件下载时、输出文件时文件名的中文乱码和空格异常
- ASP.NET实现文件下载