C# 下载https文件方法

541 阅读2分钟

1. 第一种方案

 private void downloadFileWithWebClient(string url)
 {
    ServicePointManager.DefaultConnectionLimit = 200;
    if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
    {
         System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
         ServicePointManager.ServerCertificateValidationCallback = CheckValidationResult; //验证服务器证书回调自动验证
    }
   
    if (File.Exists(mSaveFilePath))
    {
        File.Delete(mSaveFilePath);
    }
        
    WebClient web = new WebClient();
    Console.WriteLine("start to sync download.");
    web.DownloadFileAsync(new Uri(url), mSaveFilePath);
    web.DownloadFileCompleted += downloadFileCompleted;
}

void downloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
    Console.WriteLine("downloadFileCompleted");
    if (mReceiverFileListener != null)
    {
        mReceiverFileListener.onReceiverSuccess(mTaskId, mSaveFilePath);
    }
}

2.第2种方案

public void downloadFile(string url, ReceiverFileListener listener)
   {
    Console.WriteLine("downloadFile start.....");
    mReceiverFileListener = listener;
    mSaveFilePath = Path.Combine("D:\\receiver\\", "download.zip");
    ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
    HttpWebRequest request = (HttpWebRequest)WebRequest.CreateDefault(new Uri(url));
    request.Method = "GET";
    request.UserAgent = DefaultUserAgent;

    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    Stream responseStream = response.GetResponseStream();
    //创建本地文件写入流
    Stream stream = new FileStream(mSaveFilePath, FileMode.Create);
    //分段写入本地文件 
    byte[] bArr = new byte[1024];
    int size = responseStream.Read(bArr, 0, (int)bArr.Length);
    while (size > 0)
    {
        stream.Write(bArr, 0, size);
        size = responseStream.Read(bArr, 0, (int)bArr.Length);
    }
    stream.Close();
    responseStream.Close();

    Console.WriteLine("downloadFile end.....");
    if (mReceiverFileListener != null)
    {
        Console.WriteLine("success and callback.");
        mReceiverFileListener.onReceiverSuccess(mTaskId, mSaveFilePath);
    }
}

3. 使用# SharpZipLib 解压zip文件

   public string unZipFile(string TargetFile, string fileDir)
{
    string rootFile = " ";
    try
    {
        //读取压缩文件(zip文件),准备解压缩
        ZipInputStream s = new ZipInputStream(File.OpenRead(TargetFile.Trim()));
        ZipEntry theEntry;
        string path = fileDir;                   
        //解压出来的文件保存的路径
       string rootDir = " ";                        
        //根目录下的第一个子文件夹的名称
        while ((theEntry = s.GetNextEntry()) != null)
        {
            rootDir = Path.GetDirectoryName(theEntry.Name);                          
            //得到根目录下的第一级子文件夹的名称
            if (rootDir.IndexOf("\\") >= 0)
            {
                rootDir = rootDir.Substring(0, rootDir.IndexOf("\\") + 1);
            }
            string dir = Path.GetDirectoryName(theEntry.Name);                    
            //根目录下的第一级子文件夹的下的文件夹的名称
            string fileName = Path.GetFileName(theEntry.Name);                    
            //根目录下的文件名称
            if (dir != " " )                                                        
                //创建根目录下的子文件夹,不限制级别
            {
                if (!Directory.Exists(fileDir + "\\" + dir))
                {
                    path = fileDir + "\\" + dir;                                                
                    //在指定的路径创建文件夹
                    Directory.CreateDirectory(path);
                }
            }
            else if (dir == " " && fileName != "")                                              
                //根目录下的文件
            {
                path = fileDir;
                rootFile = fileName;
            }
            else if (dir != " " && fileName != "")                                              
                //根目录下的第一级子文件夹下的文件
            {
                if (dir.IndexOf("\\") > 0)                                                            
                    //指定文件保存的路径
                {
                    path = fileDir + "\\" + dir;
                }
            }

            if (dir == rootDir)                                                                                  
                //判断是不是需要保存在根目录下的文件
            {
                path = fileDir + "\\" + rootDir;
            }

            //以下为解压缩zip文件的基本步骤
            //基本思路就是遍历压缩文件里的所有文件,创建一个相同的文件。
            if (fileName != String.Empty)
            {
                FileStream streamWriter = File.Create(path + "\\" + fileName);

                int size = 2048;
                byte[] data = new byte[2048];
                while (true)
                {
                    size = s.Read(data, 0, data.Length);
                    if (size > 0)
                    {
                        streamWriter.Write(data, 0, size);
                    }
                    else
                    {
                        break;
                    }
                }

                streamWriter.Close();
            }
        }
        s.Close();

        return rootFile;
    }
    catch (Exception ex)
    {
        return "1; " + ex.Message;
    }
}