jony413

多媒体信息发布、排队叫号、医院分诊、电子班牌

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

断点下载与普通下载无非是请求时通过Range参数提交本地文件大小,其实现主要有以下两个条件:

1、服务器支持Range协议,目前大部分的Http服务器都是支持Range协议的,可以通过curl或wget去测试。

2、本地程序请求时加入Range参数。

//断点下载功能 

public void DownLoad(object obj)
{
long curLen = 0;
string uri = obj.ToString();

//截取文件名
string fileName = HttpUtility.UrlDecode(uri.Substring(uri.LastIndexOf(@"/") + 1));
//string fileName =uri.Substring(uri.LastIndexOf(@"/") + 1);
//构造文件完全限定名,准备将网络流下载为本地文件
string fileFullName = @"d:\" + fileName;
string fileTmpName = @"d:\" + fileName+".tmp";

//本地构造文件流
FileStream fs;
if (File.Exists(fileFullName))
{
return;
}
if (File.Exists(fileTmpName))
{
fs = new FileStream(fileTmpName, FileMode.Append, FileAccess.Write, FileShare.Write);
//fsCfg = fs = new FileStream(fileTmpName, FileMode.Append, FileAccess.Write, FileShare.Write);
}
else
{
fs = new FileStream(fileTmpName, FileMode.Create);
}

//请求地址
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
//请求开始位置
request.AddRange((int)fs.Length);
//已下载的本地文件大小
curLen = fs.Length;
//获取网络流
Stream ns = request.GetResponse().GetResponseStream();
//获取文件实际要下载的大小
long contentLength = request.GetResponse().ContentLength;
//文件总大小=本地文件大小+下载文件大小
long totalLen = fs.Length + contentLength;

//开辟内存空间
byte[] buffer = new byte[512];
//获取文件读取到的长度
int length = ns.Read(buffer, 0, buffer.Length);
while (length > 0)
{
//将字节数组写入流
fs.Write(buffer, 0, length);
//当前文件大小
curLen += length;
//progressText = curLen + "/" + totalLen;
//progress = Convert.ToInt32((curLen * 100) / totalLen);
//继续下载
buffer = new byte[512];
length = ns.Read(buffer, 0, buffer.Length);
}
ns.Close();
ns.Dispose();
fs.Close();
fs.Dispose();
File.Move(fileTmpName, fileFullName);
}

 

posted on 2015-11-11 11:21  jony413  阅读(190)  评论(0)    收藏  举报