asp.net2.0以后,我们有了很多种文件下载的选择。
//
提供下载的文件,不编码的话文件名会乱码
private
string
fileName
=
HttpContext.Current.Server.UrlEncode(
"
规范.rar
"
);
private
string
filePath
=
HttpContext.Current.Server.MapPath(
"
规范.rar
"
);
//
使用TransmifFile下载文件
protected
void
btnDL1_Click(
object
sender, EventArgs e)
{
FileInfo info
=
new
FileInfo(filePath);
long
fileSize
=
info.Length;
Response.Clear();
Response.ContentType
=
"
application/x-zip-compressed
"
;
Response.AddHeader(
"
Content-Disposition
"
,
"
attachment;filename=
"
+
fileName);
//
不指明Content-Length用Flush的话不会显示下载进度
Response.AddHeader(
"
Content-Length
"
, fileSize.ToString());
Response.TransmitFile(filePath,
0
, fileSize);
Response.Flush();
Response.Close();
}
//
使用WriteFile下载文件
protected
void
btnDL2_Click(
object
sender, EventArgs e)
{
FileInfo info
=
new
FileInfo(filePath);
long
fileSize
=
info.Length;
Response.Clear();
Response.ContentType
=
"
application/octet-stream
"
;
Response.AddHeader(
"
Content-Disposition
"
,
"
attachement;filename=
"
+
fileName);
//
指定文件大小
Response.AddHeader(
"
Content-Length
"
, fileSize.ToString());
Response.WriteFile(filePath,
0
, fileSize);
Response.Flush();
Response.Close();
}
//
使用OutputStream.Write分块下载文件
protected
void
btnDL3_Click(
object
sender, EventArgs e)
{
//
指定块大小
long
chunkSize
=
102400
;
//
建立一个100K的缓冲区
byte
[] buffer
=
new
byte
[chunkSize];
//
已读的字节数
long
dataToRead
=
0
;
FileStream stream
=
null
;
try
{
//
打开文件
stream
=
new
FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
dataToRead
=
stream.Length;
//
添加Http头
Response.ContentType
=
"
application/octet-stream
"
;
Response.AddHeader(
"
Content-Disposition
"
,
"
attachement;filename=
"
+
fileName);
Response.AddHeader(
"
Content-Length
"
, dataToRead.ToString());
while
(dataToRead
>
0
)
{
if
(Response.IsClientConnected)
{
int
length
=
stream.Read(buffer,
0
, Convert.ToInt32(chunkSize));
Response.OutputStream.Write(buffer,
0
, length);
Response.Flush();
Response.Clear();
dataToRead
-=
length;
}
else
{
//
防止client失去连接
dataToRead
=
-
1
;
}
}
}
catch
(Exception ex)
{
Response.Write(
"
Error:
"
+
ex.Message);
}
finally
{
if
(stream
!=
null
)
{
stream.Close();
}
Response.Close();
}
}
//
使用BinaryWrite下载文件,大文件效率不行
protected
void
btnDL4_Click(
object
sender, EventArgs e)
{
FileStream stream
=
null
;
try
{
//
读文件,大文件一次读入会占用大量内存
stream
=
new
FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
byte
[] bytes
=
new
byte
[stream.Length];
stream.Read(bytes,
0
, bytes.Length);
stream.Close();
//
添加Http头
Response.ContentType
=
"
application/octet-stream
"
;
Response.AddHeader(
"
Content-Disposition
"
,
"
attachement;filename=
"
+
fileName);
Response.AddHeader(
"
Content-Length
"
, bytes.Length.ToString());
Response.BinaryWrite(bytes);
Response.Flush();
}
catch
(Exception ex)
{
Response.Write(
"
Error:
"
+
ex.Message);
}
finally
{
if
(stream
!=
null
)
{
stream.Close();
}
Response.Close();
}
}
//
使用BinaryWrite分块下载文件
protected
void
btnDL5_Click(
object
sender, EventArgs e)
{
//
指定区块和缓冲区
long
chunkSize
=
102400
;
byte
[] buffer
=
new
byte
[chunkSize];
FileStream stream
=
null
;
long
dataToRead
=
0
;
try
{
stream
=
new
FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
dataToRead
=
stream.Length;
//
添加Http头
Response.ContentType
=
"
application/octet-stream
"
;
Response.AddHeader(
"
Content-Disposition
"
,
"
attachement;filename=
"
+
fileName);
Response.AddHeader(
"
Content-Length
"
, dataToRead.ToString());
while
(dataToRead
>
0
)
{
if
(Response.IsClientConnected)
{
int
length
=
stream.Read(buffer,
0
, Convert.ToInt32(chunkSize));
Response.BinaryWrite(buffer);
Response.Flush();
Response.Clear();
dataToRead
-=
length;
}
else
{
dataToRead
=
-
1
;
}
}
}
catch
(Exception ex)
{
Response.Write(
"
Error:
"
+
ex.Message);
}
finally
{
if
(stream
!=
null
)
{
stream.Close();
}
Response.Close();
}
}
以上除了第四种不推荐以外,其他的都可以,但是个人感觉分块下载的要好一点。没有仔细测试,所以可能有问题。
注意:对于中文文件名要编码才能正确显示。对于长中文文件名(UTF8编码后大于153字节的中文)即使编码了,还是有问题的,大家可以参考这个链接。 http://hi.baidu.com/river_5566/blog/item/d66804cef8afb031b700c863.html