zoukankan
html css js c++ java
ASP.NET提供文件下载函数
//
输出硬盘文件,提供下载 支持大文件、续传、速度限制、资源占用小
//
输入参数 _Request: Page.Request对象, _Response: Page.Response对象, _fileName: 下载文件名, _fullPath: 带文件名下载路径, _speed 每秒允许下载的字节数
//
返回是否成功
public
static
bool
ResponseFile(HttpRequest _Request,HttpResponse _Response,
string
_fileName,
string
_fullPath,
long
_speed)
{
try
{
FileStream myFile
=
new
FileStream(_fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
BinaryReader br
=
new
BinaryReader(myFile);
try
{
_Response.AddHeader(
"
Accept-Ranges
"
,
"
bytes
"
);
_Response.Buffer
=
false
;
long
fileLength
=
myFile.Length;
long
startBytes
=
0
;
int
pack
=
10240
;
//
10K bytes
//
int sleep = 200;
//
每秒5次 即5*10K bytes每秒
int
sleep
=
(
int
)Math.Floor(
1000
*
pack
/
_speed)
+
1
;
if
(_Request.Headers[
"
Range
"
]
!=
null
)
{
_Response.StatusCode
=
206
;
string
[] range
=
_Request.Headers[
"
Range
"
].Split(
new
char
[]
{
'
=
'
,
'
-
'
}
);
startBytes
=
Convert.ToInt64(range[
1
]);
}
_Response.AddHeader(
"
Content-Length
"
, (fileLength
-
startBytes).ToString());
if
(startBytes
!=
0
)
{
_Response.AddHeader(
"
Content-Range
"
,
string
.Format(
"
bytes {0}-{1}/{2}
"
, startBytes, fileLength
-
1
, fileLength));
}
_Response.AddHeader(
"
Connection
"
,
"
Keep-Alive
"
);
_Response.ContentType
=
"
application/octet-stream
"
;
_Response.AddHeader(
"
Content-Disposition
"
,
"
attachment;filename=
"
+
HttpUtility.UrlEncode(_fileName,System.Text.Encoding.UTF8) );
br.BaseStream.Seek(startBytes, SeekOrigin.Begin);
int
maxCount
=
(
int
) Math.Floor((fileLength
-
startBytes)
/
pack)
+
1
;
for
(
int
i
=
0
; i
<
maxCount; i
++
)
{
if
(_Response.IsClientConnected)
{
_Response.BinaryWrite(br.ReadBytes(pack));
Thread.Sleep(sleep);
}
else
{
i
=
maxCount;
}
}
}
catch
{
return
false
;
}
finally
{
br.Close();
myFile.Close();
}
}
catch
{
return
false
;
}
return
true
;
}
调用例
Page.Response.Clear();
bool
success
=
ResponseFile(Page.Request, Page.Response,
"
filename
"
,
@"
C:\download.date
"
,
1024000
);
if
(
!
success)
Response.Write(
"
下载文件出错!
"
);
Page.Response.End();
查看全文
相关阅读:
iscsi一致性的测试验证方法
ceph各个版本之间参数变化分析
rgw的rgw_thread_pool_size配置调整
rgw前端替换civetweb为beast
配置内网访问的TV
关于vm.min_free_kbytes的合理设置推测
rbd的删除回收站功能
python爬取微博热门话题榜
Selenium+Pytest自动化测试框架—禅道实战
python带参数装饰器的两种写法
原文地址:https://www.cnblogs.com/chengulv/p/467222.html
最新文章
POJ2421 Constructing Roads
最短路径算法二
最短路径算法一
图的最小生成树——Prim算法
[大山中学模拟赛] 2016.9.10
[南寒杂题] 2017.1~2017.2集训
[Poi2015]
搜索+剪枝——运筹帷幄 (road.cpp)
map——映射(message.cpp)
图的最短路径问题————树上奶牛(tree.cpp)
热门文章
回溯算法————n皇后、素数串
c++STL之sort排序
Do Palapala (this)
Stat
多叉树与二叉树转换
第一篇博客
一个小bug的总结
centos7单独编译nbd内核模块
通过tuned-adm调整服务器的各种参数
测试cephfs写入海量文件
Copyright © 2011-2022 走看看