返回列表 发新帖

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

131.7k 9
swmozowtfl 发表于 2015-7-31 22:04:01|湖北 | 查看全部 阅读模式
本文实例讲述了asp.net下载大文件的实现方法。分享给大家供大家参考。具体分析如下:
/ _2 d) |+ @/ Y0 ?当我们的网站需要支持下载大文件时,如果不做控制可能会导致用户在访问下载页面时发生无响应,使得浏览器崩溃。可以参考如下代码来避免这个问题。+ I% t: J' ~+ j
关于此代码的几点说明:8 Z$ K* v, _$ D% l
1. 将数据分成较小的部分,然后将其移动到输出流以供下载,从而获取这些数据。
3 ~* C) I6 M/ D0 j2. 根据下载的文件类型来指定 response.contenttype 。(参考oschina的这个网址可以找到大部分文件类型的对照表:)
- d( T) Y1 A3 d( }# v3. 在每次写完response时记得调用 response.flush()
; p- d. O5 ?5 L1 s" [# \4. 在循环下载的过程中使用 response.isclientconnected 这个判断可以帮助程序尽早发现连接是否正常。若不正常,可以及早的放弃下载,以释放所占用的服务器资源。
4 a. P/ o. y  n4 b7 O3 `7 B4 q5. 在下载结束后,需要调用 response.end() 来保证当前线程可以在最后被终止掉。
9 U" s3 z: ~* |+ C4 F  w3 h代码如下:
& j" \2 j: A9 D2 f: }) ^# x
using system;
6 L) W- W0 ?" l! X1 N* B/ Q7 d7 [namespace webapplication1  M8 y- E0 v: F" u; a/ x
{
" n7 f' O3 Y- n  [3 P  O6 Kpublic partial class downloadfile : system.web.ui.page
* R2 o% D7 y$ V% _2 p' v5 d, ]/ F; j{
9 q- {- F( j7 M0 [protected void page_load(object sender, eventargs e)1 \! C& K3 I" z3 }
{
* Z$ E7 U# D8 U0 S3 Osystem.io.stream istream = null;4 D" U+ v9 }* `; a
// buffer to read 10k bytes in chunk:
4 p! b) ^. j8 w# q* K  t( jbyte[] buffer = new byte[10000];
6 G. K4 r9 N; S// length of the file:
3 A3 M! ?3 B9 Y1 z, lint length;9 C- ?  P+ {; J
// total bytes to read.$ {  O9 @+ E) B2 W
long datatoread;
; k. f  {7 W! c# `: f// identify the file to download including its path.. A7 q6 y  X$ A& ?, j7 D/ f
string filepath = server.mappath(/) +./files/textfile1.txt;
+ ?% S; \1 T2 k7 K" K( T$ z" z// identify the file name.
# O8 V& t5 M: L7 d( x9 f: wstring filename = system.io.path.getfilename(filepath);
( R7 F3 Z5 X) r1 N5 ntry
6 ~9 i3 ~: r' D{: ?! |. d; |6 n# ~$ o. l- `) z6 ~
// open the file., Q1 p$ F) \$ B* v3 O% m* g
istream = new system.io.filestream(filepath, system.io.filemode.open,8 M. b; S: ?) y1 P6 H
system.io.fileaccess.read, system.io.fileshare.read);
$ r' \" ?9 Y! F( h// total bytes to read.  D1 x" r6 b/ [2 b
datatoread = istream.length;- [4 E; J; I3 d' l8 h- \
response.clear();
9 M# e( g& a( l  c, [% U; m8 uresponse.clearheaders();" ]! H/ y' d  L9 \* M
response.clearcontent();: ~1 Z4 d/ r) f' l2 a
response.contenttype = text/plain; // set the file type
; L% o: k3 q; S, G8 S: Kresponse.addheader(content-length, datatoread.tostring());9 G( G/ A$ y2 k
response.addheader(content-disposition, attachment; filename= + filename);4 s* g: g% c! L- R* |
// read the bytes.
' p! {" f5 ]) o" j) t; Q6 Mwhile (datatoread > 0)
5 [9 Y4 ^5 w4 x1 N9 Q4 N. t6 b$ M{5 G* k( v6 ^( F  u3 ^& Q/ N6 q
// verify that the client is connected.
! I$ `5 Y. B/ S' o8 }1 lif (response.isclientconnected)+ J+ _% V( ?* Y6 T- D
{
6 i' a0 g2 ~7 g% s// read the data in buffer.
0 f, A. J- `  ?1 W; v  ilength = istream.read(buffer, 0, 10000);
. W% N" ^( d( v# f: {// write the data to the current output stream.
5 M; C: V2 i9 [- \8 wresponse.outputstream.write(buffer, 0, length);. R1 \- `: L) Z5 N
// flush the data to the html output.
) ^% q) o8 y! yresponse.flush();) J# I: W, L7 k% Y0 L9 [% p9 J
buffer = new byte[10000];' \. |: M- B3 W( `
datatoread = datatoread - length;
3 W6 V& A  t3 i! K}5 A( P4 k2 s5 R. ]
else1 Y, O- e. \1 U# W* ~8 p" c$ p& E
{+ |, Z4 v' i$ D
// prevent infinite loop if user disconnects
/ M. m0 \* b5 u. ^datatoread = -1;
% E/ N! {. u1 c2 W3 [" |, C* |}
7 N1 @; S& Y5 B/ v( D2 t}
0 |2 f$ Y  z: g4 |3 ]0 K7 P}, M( S  U, G  a/ I
catch (exception ex), p1 ^  g0 o! o1 i! g* Y: O1 B8 ~
{# e! i6 r" n" ^9 I8 c9 R& l
// trap the error, if any.: m) N; B9 P& f# a* _0 }
response.write(error :  + ex.message);1 P2 b0 @  }/ Q$ G" m8 k
}, J( K4 A7 j* [& ?
finally9 T  L& H3 t9 x0 \7 \  W
{0 R8 ^% f$ L* ]# R+ {
if (istream != null); Q7 a0 w, E# ^/ S" s% ^$ i
{
3 K  U' D! _/ \; X. d7 E//close the file.# S. d; t1 _; {" y
istream.close();5 `- X1 R8 W9 L! c3 t9 q+ O
}/ q' Y9 X$ w0 g" Q2 D) O
response.end();+ j( P, J2 J. v2 H& e
}: Y' a& h: k1 v) h' F( B! }
}' [: D2 w! `* w
}
( g5 _2 T6 T! {4 G6 h}
0 ?: S/ g2 q* {0 n+ }2 f" a希望本文所述对大家的asp.net程序设计有所帮助。! a' G, H4 i! k
6 m1 o0 t2 m1 m/ {
更多网页制作信息请查看: 网页制作

回复|共 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 站长技术交流论坛|互联网技术交流平台|Ai技术交流平台 版权所有 All Rights Reserved. Powered by Discuz! X5.0 鄂ICP备15006301号-5|鄂公网安备 42018502006730号
关灯 在本版发帖 扫一扫添加QQ客服 返回顶部
快速回复 返回顶部 返回列表