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

一、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#下载实例一

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值