1
public
partial
class
FileDownLoad : System.Web.UI.Page
2
{
3
//
提供下载的文件,不编码的话文件名会乱码
4
private
string
fileName
=
HttpContext.Current.Server.UrlEncode(
"
规范.rar
"
);
5
private
string
filePath
=
HttpContext.Current.Server.MapPath(
"
规范.rar
"
);
6
//
使用TransmifFile下载文件
7
protected
void
btnDL1_Click(
object
sender, EventArgs e)
8
{
9
FileInfo info
=
new
FileInfo(filePath);
10
long
fileSize
=
info.Length;
11
Response.Clear();
12
Response.ContentType
=
"
application/x-zip-compressed
"
;
13
Response.AddHeader(
"
Content-Disposition
"
,
"
attachment;filename=
"
+
fileName);
14
//
不指明Content-Length用Flush的话不会显示下载进度
15
Response.AddHeader(
"
Content-Length
"
, fileSize.ToString());
16
Response.TransmitFile(filePath,
0
, fileSize);
17
Response.Flush();
18
Response.Close();
19
}
20
21
//
使用WriteFile下载文件
22
protected
void
btnDL2_Click(
object
sender, EventArgs e)
23
{
24
FileInfo info
=
new
FileInfo(filePath);
25
long
fileSize
=
info.Length;
26
Response.Clear();
27
Response.ContentType
=
"
application/octet-stream
"
;
28
Response.AddHeader(
"
Content-Disposition
"
,
"
attachement;filename=
"
+
fileName);
29
//
指定文件大小
30
Response.AddHeader(
"
Content-Length
"
, fileSize.ToString());
31
Response.WriteFile(filePath,
0
, fileSize);
32
Response.Flush();
33
Response.Close();
34
}
35
36
//
使用OutputStream.Write分块下载文件
37
protected
void
btnDL3_Click(
object
sender, EventArgs e)
38
{
39
//
指定块大小
40
long
chunkSize
=
102400
;
41
//
建立一个100K的缓冲区
42
byte
[] buffer
=
new
byte
[chunkSize];
43
//
已读的字节数
44
long
dataToRead
=
0
;
45
FileStream stream
=
null
;
46
try
47
{
48
//
打开文件
49
stream
=
new
FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
50
dataToRead
=
stream.Length;
51
52
//
添加Http头
53
Response.ContentType
=
"
application/octet-stream
"
;
54
Response.AddHeader(
"
Content-Disposition
"
,
"
attachement;filename=
"
+
fileName);
55
Response.AddHeader(
"
Content-Length
"
, dataToRead.ToString());
56
57
while
(dataToRead
>
0
)
58
{
59
if
(Response.IsClientConnected)
60
{
61
int
length
=
stream.Read(buffer,
0
, Convert.ToInt32(chunkSize));
62
Response.OutputStream.Write(buffer,
0
, length);
63
Response.Flush();
64
Response.Clear();
65
dataToRead
-=
length;
66
}
67
else
68
{
69
//
防止client失去连接
70
dataToRead
=
-
1
;
71
}
72
}
73
}
74
catch
(Exception ex)
75
{
76
Response.Write(
"
Error:
"
+
ex.Message);
77
}
78
finally
79
{
80
if
(stream
!=
null
)
81
{
82
stream.Close();
83
}
84
Response.Close();
85
}
86
}
87
88
//
使用BinaryWrite下载文件,大文件效率不行
89
protected
void
btnDL4_Click(
object
sender, EventArgs e)
90
{
91
FileStream stream
=
null
;
92
try
93
{
94
//
读文件,大文件一次读入会占用大量内存
95
stream
=
new
FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
96
byte
[] bytes
=
new
byte
[stream.Length];
97
stream.Read(bytes,
0
, bytes.Length);
98
stream.Close();
99
100
//
添加Http头
101
Response.ContentType
=
"
application/octet-stream
"
;
102
Response.AddHeader(
"
Content-Disposition
"
,
"
attachement;filename=
"
+
fileName);
103
Response.AddHeader(
"
Content-Length
"
, bytes.Length.ToString());
104
Response.BinaryWrite(bytes);
105
Response.Flush();
106
}
107
catch
(Exception ex)
108
{
109
Response.Write(
"
Error:
"
+
ex.Message);
110
}
111
finally
112
{
113
if
(stream
!=
null
)
114
{
115
stream.Close();
116
}
117
Response.Close();
118
}
119
}
120
//
使用BinaryWrite分块下载文件
121
protected
void
btnDL5_Click(
object
sender, EventArgs e)
122
{
123
//
指定区块和缓冲区
124
long
chunkSize
=
102400
;
125
byte
[] buffer
=
new
byte
[chunkSize];
126
FileStream stream
=
null
;
127
long
dataToRead
=
0
;
128
try
129
{
130
stream
=
new
FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
131
dataToRead
=
stream.Length;
132
//
添加Http头
133
Response.ContentType
=
"
application/octet-stream
"
;
134
Response.AddHeader(
"
Content-Disposition
"
,
"
attachement;filename=
"
+
fileName);
135
Response.AddHeader(
"
Content-Length
"
, dataToRead.ToString());
136
137
while
(dataToRead
>
0
)
138
{
139
if
(Response.IsClientConnected)
140
{
141
int
length
=
stream.Read(buffer,
0
, Convert.ToInt32(chunkSize));
142
Response.BinaryWrite(buffer);
143
Response.Flush();
144
Response.Clear();
145
146
dataToRead
-=
length;
147
}
148
else
149
{
150
dataToRead
=
-
1
;
151
}
152
}
153
154
}
155
catch
(Exception ex)
156
{
157
Response.Write(
"
Error:
"
+
ex.Message);
158
}
159
finally
160
{
161
if
(stream
!=
null
)
162
{
163
stream.Close();
164
}
165
Response.Close();
166
}
167
}
168
}
169