返回列表 发新帖

asp.net下载大文件的实现方法

131.7k 9
swmozowtfl 发表于 2015-7-31 22:04:01|湖北 | 查看全部 阅读模式
本文实例讲述了asp.net下载大文件的实现方法。分享给大家供大家参考。具体分析如下:
! c% S0 l5 N3 n1 M$ n  [当我们的网站需要支持下载大文件时,如果不做控制可能会导致用户在访问下载页面时发生无响应,使得浏览器崩溃。可以参考如下代码来避免这个问题。
- g  R: E* o- j5 T关于此代码的几点说明:( c9 h# X( I; F1 {
1. 将数据分成较小的部分,然后将其移动到输出流以供下载,从而获取这些数据。* n  R( n& h. N, Q7 ?
2. 根据下载的文件类型来指定 response.contenttype 。(参考oschina的这个网址可以找到大部分文件类型的对照表:)$ \4 w: c  X, o% i' Z
3. 在每次写完response时记得调用 response.flush()- a: a- u' d7 ]! D9 f; o9 N
4. 在循环下载的过程中使用 response.isclientconnected 这个判断可以帮助程序尽早发现连接是否正常。若不正常,可以及早的放弃下载,以释放所占用的服务器资源。
" E% {6 O7 g5 `5. 在下载结束后,需要调用 response.end() 来保证当前线程可以在最后被终止掉。$ D. i  A3 q2 P* p* p
代码如下:3 v  s9 M) F2 B; w  m7 ^) N1 d
using system;
+ v( W4 |; V8 V7 c# y4 vnamespace webapplication1* A! T9 I- ^! e
{8 Z, A5 S* E( P3 t- |+ r
public partial class downloadfile : system.web.ui.page
# N" F3 v, ^8 i) @{% t3 a+ s% W# u" u: L0 K' n
protected void page_load(object sender, eventargs e)
0 ^/ C- s. f0 _0 q! d, }( b{, v' {2 X& u& B/ Z- `$ x
system.io.stream istream = null;
' Q) S, M7 |& }, I, n// buffer to read 10k bytes in chunk:
* U$ `' t9 u: o; F6 N% qbyte[] buffer = new byte[10000];( d; @1 f; K- u! B& ~+ Z2 o2 g$ O9 U
// length of the file:
/ h9 u& n' v( G) q: Q) i- B, |int length;" O3 Y0 @% n( n' x+ W: w$ ~0 g
// total bytes to read.7 J+ Z# s6 [/ @5 |4 v
long datatoread;/ b: ]  p5 g0 D5 T
// identify the file to download including its path.8 G2 x2 u8 @9 u  T( k3 c' h: }
string filepath = server.mappath(/) +./files/textfile1.txt;
( f7 d+ C9 |* N) N4 I) |// identify the file name.
" t2 M/ z/ Y% T# A0 dstring filename = system.io.path.getfilename(filepath);, r2 v$ \) s4 k8 ~
try. i) W! K. _- F; A
{9 E# R& k6 y  q5 ]! _: P: V
// open the file.8 Q! b4 y" C9 P/ @0 K
istream = new system.io.filestream(filepath, system.io.filemode.open,
! D# I" u2 \/ C4 |system.io.fileaccess.read, system.io.fileshare.read);
) E5 g2 V, G; F1 m' F$ S// total bytes to read.
' p. Z4 T# T5 q, n+ c3 mdatatoread = istream.length;, b9 ~3 Q' f4 w& ^
response.clear();
3 u0 d6 X( k: }5 T# Nresponse.clearheaders();
% v( {/ j' G& V$ d/ M% `- u" z/ Lresponse.clearcontent();
: w3 \9 e; V! F; K: C/ Xresponse.contenttype = text/plain; // set the file type1 B6 G2 l+ G; @1 B
response.addheader(content-length, datatoread.tostring());
* B6 X. J2 Y: P2 fresponse.addheader(content-disposition, attachment; filename= + filename);9 J5 I# W8 Q$ J/ r' K: n5 `* x
// read the bytes.
& ~% w, f2 u  b8 F& b( Y* g3 l8 G; X4 Jwhile (datatoread > 0)
; x7 h/ l. j  {! X{
6 n/ v# q! h' m6 v1 P6 S9 U// verify that the client is connected.
" {" A, a' D0 f+ Dif (response.isclientconnected)/ K8 H" M: H% w; N) d# h
{
& z4 f5 O& U4 }" `# B# G8 O// read the data in buffer.
+ Q; q3 O9 ]& H  D' b& s& I! W1 qlength = istream.read(buffer, 0, 10000);4 e5 O* q7 Y; O6 B! F2 a
// write the data to the current output stream.
1 M7 r7 V/ {8 a' A6 n- presponse.outputstream.write(buffer, 0, length);) G: x' I/ |+ n
// flush the data to the html output.
9 y8 n1 c. ?: r+ I2 nresponse.flush();
# Z: {( x) r' Gbuffer = new byte[10000];
0 l- P' U" B$ G+ adatatoread = datatoread - length;
, {& q: U4 V# T' v4 {8 E}
& h* n! ]  _3 A8 Yelse# R/ \' B2 u" P' I0 J  v; s/ a
{# K) P2 d3 I3 w* T; p5 s
// prevent infinite loop if user disconnects
) ]3 \/ [" `' v5 q  f* H2 ?" fdatatoread = -1;
4 I3 q& h9 {: j/ R}* {  m! A, x& X9 [% b4 z
}
3 U- p6 S/ u, R6 F; _% B# w}* w/ p; p5 X. ]- Q  ~
catch (exception ex)
8 p& W0 z* b7 p( e{. |4 G5 n1 q, }8 }
// trap the error, if any.
9 W' o% [  X! n8 k# L4 wresponse.write(error :  + ex.message);3 N. u" R8 X" L# x3 j3 c
}5 m- `- I! b9 b/ c0 N
finally
7 g! _$ D0 `1 Q- K3 _4 q  A: I{
; N% G3 u; `& s6 I5 o/ kif (istream != null)
3 O  A( i2 L, r" W- L6 Q. W{5 Z6 N# P0 l+ R* n1 a0 x/ j* ~& ?
//close the file.- z. f' _8 w$ E/ _5 @2 [- n
istream.close();+ w% K8 L) k: }/ F2 d* Z" y
}
9 n8 @8 D) r0 W2 gresponse.end();( ]0 e+ j3 Q3 c7 H2 c* t6 n. p
}
* }3 m1 b9 X+ ^3 I6 j}
! o+ ~6 O. d. R$ S* i}( a; O  r# F+ |3 t
}
6 r+ F2 |2 S) K) i, q1 U希望本文所述对大家的asp.net程序设计有所帮助。+ i) ~/ X: D5 {

7 O6 A( N) u4 P' J9 |6 g* ^. J8 [更多网页制作信息请查看: 网页制作

回复|共 9 个

seazvyt 发表于 2015-9-13 18:22:15|巴西 | 查看全部
对于这种刚发的帖子,我总是毫不犹豫的顶了。如果火了就是个前排,可以混个脸熟,说不定谁好心就给粉了…稳赚不赔;如果沉了就感觉是我弄沉的,很有成就感,还能捞经验。
mwxny 发表于 2015-9-13 18:22:21|加拿大 | 查看全部
这篇帖子构思新颖,题材独具匠心,段落清晰,情节诡异,跌宕起伏,主线分明,引人入胜,平淡中显示出不凡的文学功底,可谓是字字珠玑,句句经典,是我辈应当学习之典范(不好意思回错帖了
Mqokjdvq 发表于 2015-9-13 18:23:16|中国 | 查看全部
感觉这个论坛的站长太牛B了,好强大啊
buingeEvineus 发表于 2015-9-13 18:23:36|美国 | 查看全部
这个论坛值得推荐,给了我们这么好的一个平台
wwzcdenleclv 发表于 2015-9-13 18:23:37|欧洲 | 查看全部
这就是我斗胆的一点粗略分析,每天睡觉以前,我都会把您的帖子再三拜读,拜读。
seazvyt 发表于 2015-12-25 20:48:33|亚太地区 | 查看全部
老大,我好崇拜你哟
mwxny 发表于 2015-12-25 20:48:44|山东 | 查看全部
这个论坛值得推荐,给了我们这么好的一个平台
effoggikeftor 发表于 2015-12-25 20:48:53|美国 | 查看全部
只是本着“看贴(虽然看不懂)回贴,利人利己的中华民族优秀传统美德”,顺便赚点积分。
effoggikeftor 发表于 2015-12-25 20:49:04|美国 | 查看全部
cd:遮~~~~~~

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

得知互动是一个融创意、设计、开发、营销、生活、互联网于一体的专业交流分享平台。
Copyright © 2026 站长技术交流论坛|互联网技术交流平台 版权所有 All Rights Reserved. Powered by Discuz! X5.0 鄂ICP备15006301号-5|鄂公网安备 42018502006730号
关灯 在本版发帖 扫一扫添加QQ客服 返回顶部
快速回复 返回顶部 返回列表