您的位置:首页 > 编程语言 > C#

C#分块下载文件实例(二)

2016-09-18 14:59 211 查看
一、C#下载实例二

1、测试入口

/// <summary>
/// 可指定cookie的方式下载
/// </summary>
public static void Test2()
{
string url = "http://v2.mukewang.com/98672526-02b5-454c-b31e-d8526755b40b/L.mp4?auth_key=1474171330-0-0-8ff3fe3a33cfd257577dfa999e41530d";
int currentSize = 0;
//第一次请求处理
HttpWebRequest request = GetRequest(url, currentSize);
//获取请求响应
HttpWebResponse resp = (HttpWebResponse)request.GetResponse();
string filename = GetFileName(url, resp);
//创建写入流
FileStream fs = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.Write);
//从响应流中持续读取并保存文件
int readCount = WriteFile(resp, fs);
//关闭流
fs.Close();
Console.WriteLine("下载文件成功");
}

2.其他方法定义:
/// <summary>
/// 指定响应流,将响应流中的数据写入文件
/// </summary>
/// <param name="filename"></param>
/// <param name="resp"></param>
public static int WriteFile(HttpWebResponse resp, FileStream fs)
{
//将响应内容写入文件
Stream stream = resp.GetResponseStream();
//先读出,然后写入
byte[] bytes = new byte[1024 * 512];
int count = 0;
int readCount = 0; //从相应流中读取到的文件大小
while ((count = stream.Read(bytes, 0, bytes.Length)) > 0)
{
//写入文件
fs.Write(bytes, 0, count);
//清空
fs.Flush();
readCount += count;
Console.WriteLine("本次读取:" + count);
}
stream.Close();
return readCount;
}
/// <summary>
/// 指定连接地址,指定开始位置或结束位置请求文件内容
/// </summary>
public static HttpWebRequest GetRequest(string url, int start, int? end = null)
{
try
{
HttpWebRequest request = WebRequest.CreateHttp(url);
request.Method = "GET";
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36";
//request.Referer = "http://www.imooc.com/video/11555";
//添加cookie
//request.Headers.Add("cookie", "imooc_uuid=ec12ea83-f2c0-4c14-9dd1-55fbefea18a0; imooc_isnew_ct=1468544598; loginstate=1; apsid=g2ZmJlMTE1MmExYWEwODE0ZTAzNTZmNjJmZDMzN2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjI2MDQ1NQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxMDA3MTczMTMyQHFxLmNvbQAAAAAAAAAAAAAAAAAAAGQwOTNjNWUwNjA5MjI3ZDk5MjIxNzc3OWUwYTBlODEzk%2BK8V5PivFc%3DYj; last_login_username=1007173132%40qq.com; bdshare_firstime=1472599723791; PHPSESSID=gqgpva8utntcni03v2nkk69441; jwplayer.volume=100; imooc_isnew=2; cvde=57d5eee17b1e2-41; Hm_lvt_f0cfcccd7b1393990c78efdeebff3968=1473207620,1473291733,1473638111,1473809917; Hm_lpvt_f0cfcccd7b1393990c78efdeebff3968=1473814335; IMCDNS=0");

request.Headers.Add("Accept-Encoding", "identity;q=1, *;q=0");
request.Headers.Add("Accept-Language", "zh-CN,zh;q=0.8");
request.KeepAlive = true;
if (end != null)
request.AddRange(start, end.Value);
else
request.AddRange(start);

request.Headers.Add("If-None-Match", "56f105a0-33c14ce");
request.Headers.Add("Cache-Control", "max-age=0");
request.IfModifiedSince = DateTime.Now;

return request;
}
catch (Exception ex)
{
throw new Exception("创建请求失败:" + ex.Message);
}
}
/// <summary>
/// 获取下载文件名称,根据Mime类型设置
/// </summary>
private static string GetFileName(string url, HttpWebResponse resp)
{
Uri uri = new Uri(url);
string filename = uri.AbsolutePath.Substring(uri.AbsolutePath.LastIndexOf("/") + 1);
filename = LocalPathHelper.CurrentSolution + "/data/" + filename;
if (filename.Contains(".") == false && string.IsNullOrEmpty(resp.ContentType) == false)
{
string content = resp.ContentType.ToLower();
if (content.Contains("text/plain"))
{
filename += ".txt";
}
else if (content.Contains("text/html"))
{
filename += ".html";
}
else if (content.Contains("application/json"))
{
filename += ".json";
}
}
//测试使用删除已经存在的文件
if (File.Exists(filename))
File.Delete(filename);
return filename;
}
C#下载实例一
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: