返回列表 发新帖

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

132.1k 9
swmozowtfl 发表于 2015-7-31 22:04:01|湖北 | 查看全部 阅读模式
本文实例讲述了asp.net下载大文件的实现方法。分享给大家供大家参考。具体分析如下:
4 Y: |3 P8 ?, Z1 B5 }当我们的网站需要支持下载大文件时,如果不做控制可能会导致用户在访问下载页面时发生无响应,使得浏览器崩溃。可以参考如下代码来避免这个问题。
4 j4 J" O: @, E( k- c/ Z关于此代码的几点说明:; \4 D7 J6 S/ u" S% c9 ]0 W0 K
1. 将数据分成较小的部分,然后将其移动到输出流以供下载,从而获取这些数据。, ?" M2 J; B' ?9 c5 E4 {) M
2. 根据下载的文件类型来指定 response.contenttype 。(参考oschina的这个网址可以找到大部分文件类型的对照表:)
4 L7 ^- Y) z* v. J3. 在每次写完response时记得调用 response.flush()
" S1 b* g0 W4 }. |6 a3 |4. 在循环下载的过程中使用 response.isclientconnected 这个判断可以帮助程序尽早发现连接是否正常。若不正常,可以及早的放弃下载,以释放所占用的服务器资源。
; P* r% g+ B% W5. 在下载结束后,需要调用 response.end() 来保证当前线程可以在最后被终止掉。- Q; E7 u* H9 b& N3 o! }8 N6 u
代码如下:" M! @$ R6 S. k3 f5 {, n9 [
using system;
) V! e4 k: r( Rnamespace webapplication1
, j) s  j" O7 L{
- J% h5 H4 A6 Upublic partial class downloadfile : system.web.ui.page
+ |* {- I# k! Z+ v4 I{
6 H! o* p- C2 s0 f$ r+ |# u1 ]: @/ Hprotected void page_load(object sender, eventargs e)
/ b% Y2 x+ b: a# \{' E8 o; c" z& |
system.io.stream istream = null;
( H! V( l+ q/ X+ }3 f# ~// buffer to read 10k bytes in chunk:
( @1 F/ G. \3 b' T4 zbyte[] buffer = new byte[10000];
9 z' s2 }; D8 }$ `. J// length of the file:# m5 x& w3 k" V. z# i6 e0 G
int length;
4 }, A: f) x0 ^// total bytes to read.
! U+ B) y5 Q+ \3 t! L/ dlong datatoread;
6 L: e' @4 I4 x$ |9 ]( B& P9 ~// identify the file to download including its path." \- d1 }3 E8 }  h+ C- C
string filepath = server.mappath(/) +./files/textfile1.txt;
$ e! ^( ^, c9 n, J' }// identify the file name.
+ `, x9 U3 s! |/ G# I; u. t" ]: `string filename = system.io.path.getfilename(filepath);
! F$ c, x/ S; K% m8 n& stry
3 Y& n* Z8 L1 {{
+ }* W% D1 w6 L4 c1 v// open the file.$ _# B4 t) O( J# f5 ]" n
istream = new system.io.filestream(filepath, system.io.filemode.open," e) Q, F6 x6 y! F0 C
system.io.fileaccess.read, system.io.fileshare.read);. C2 D7 ?# f8 O. Q/ b- v# U( C/ Y8 O
// total bytes to read.
2 f$ K6 L+ U0 w& u$ Ddatatoread = istream.length;2 }& e1 o6 I; {- j3 t5 O
response.clear();
  y" l3 G& `7 Q6 Qresponse.clearheaders();2 b- x6 J; K. V+ e/ L" O
response.clearcontent();7 I- \6 W/ t/ J1 i
response.contenttype = text/plain; // set the file type
6 P7 ]  I- U% W" X6 R- n  ^9 B; Jresponse.addheader(content-length, datatoread.tostring());
, G+ I! ^9 d5 dresponse.addheader(content-disposition, attachment; filename= + filename);+ x9 N' A+ F" w0 X$ M# K
// read the bytes.* `; Q0 r! a. {# w% N
while (datatoread > 0)
  b. _- e+ t6 U{
, B8 `& r3 t8 p7 {3 `" f// verify that the client is connected.
" Y8 o2 M' O3 `: mif (response.isclientconnected)
% b, s" ]7 b* a{2 _* t6 `! t( v  _/ }9 P
// read the data in buffer.
7 L, c; d* b+ Glength = istream.read(buffer, 0, 10000);& p2 ~7 O$ i* Y, [, A
// write the data to the current output stream.2 p' B! l& Q9 h- Y6 J
response.outputstream.write(buffer, 0, length);# s; h! o6 j, V% `9 f& B. w
// flush the data to the html output.5 l! h4 R/ ]8 M5 ~3 ?0 w6 S7 @
response.flush();6 t- D0 A$ b0 K# X
buffer = new byte[10000];+ S8 l3 q' L7 t' A7 V# k3 ?$ k: H
datatoread = datatoread - length;
3 p0 s8 f1 o1 |% \}/ O' E# z+ n9 L- s0 U% Z+ a
else3 c& a, i0 w$ Y  z$ Q
{( b7 R9 F1 R# ~6 p
// prevent infinite loop if user disconnects
& |7 H" l5 ?( N1 b" }2 jdatatoread = -1;/ x% C) @5 f: _- @# Q! k" A
}. T6 C5 ~, v; E$ s8 X
}
- W) D9 B% c: }% W* _! H}2 H6 e9 P! B) n
catch (exception ex)
/ n8 Z1 m3 H+ Q% _9 }{
9 a- s) b# I7 x$ s5 \, d3 q+ h// trap the error, if any.
% `& Z% P5 U; e7 x$ F, G+ Nresponse.write(error :  + ex.message);
0 l, r. G0 v  G7 Y2 w5 e9 C) V# ^1 O}& c" c4 J8 B+ i+ T6 Z* T# a  M
finally
( c! U% }2 L8 a9 m  @+ \3 v{
+ y/ p$ X! R9 W+ L, oif (istream != null)2 u( |) w; N7 R6 l% m( C/ s
{" Z  y, ?# F4 m( h/ B) x' K3 L
//close the file.) B# K, U6 C, ^% [, h: u
istream.close();1 ~/ m2 r0 X: V5 O
}$ m3 ~1 D) C# ~% |
response.end();5 ~  A4 g2 Z# r' J+ Y
}' Y6 A/ e9 C3 n, z: Z5 _! d
}
/ x( Y% P% x( O  E5 u" o}. n5 K; o/ D; C
}
; j5 \( l4 B2 Z* w' l: m希望本文所述对大家的asp.net程序设计有所帮助。
( k+ v. P# W; |
3 y7 p$ `' s, a' y! ^7 [4 T  b) Q更多网页制作信息请查看: 网页制作

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