C# http方式下載文件,壓縮文件

1、引入動態庫ICSharpCode.SharpZipLib.Zip

2、代碼 實現:

  public class DownFileHelper
    {
        /// <summary>
        /// Http方式下載文件
        /// </summary>
        /// <param name="url">http地址</param>
        /// <param name="localfile">本地文件</param>
        /// <returns></returns>
        public bool Download(string url, string localfile,out string message)
        {
            message = string.Empty;
            bool flag = false;
            long startPosition = 0; // 上次下載的文件起始位置
            FileStream writeStream; // 寫入本地文件流對象
            string remoteFileLength = GetInfo(url);
            if (Convert.ToDouble(remoteFileLength) <= 0 || remoteFileLength == "無法檢測")
            {
                message = "遠程文件不存在";
                 return false;
            }
            //long remoteFileLength = GetHttpLength(url); // 取得遠程文件長度
            //Console.WriteLine("remoteFileLength=" + remoteFileLength);
            //if (remoteFileLength == 745)
            //{
            //    message="遠程文件不存在";
            //    return false;
            //}

            //判斷要下載的文件夾是否存在
            if (File.Exists(localfile))
            {
                File.Delete(localfile);
                writeStream = new FileStream(localfile, FileMode.Create); // 文件不保存創建一個文件
                startPosition = 0;
            }
            else
            {
                writeStream = new FileStream(localfile, FileMode.Create); // 文件不保存創建一個文件
                startPosition = 0;
            }

            try
            {
                HttpWebRequest myRequest = (HttpWebRequest) WebRequest.Create(url); // 打開網絡連接
                if (startPosition > 0)
                {
                    myRequest.AddRange((int) startPosition); // 設置Range值,與上面的writeStream.Seek用意相同,是爲了定義遠程文件讀取位置
                }

                Stream readStream = myRequest.GetResponse().GetResponseStream(); // 向服務器請求,獲得服務器的迴應數據流
                byte[] btArray = new byte[512]; // 定義一個字節數據,用來向readStream讀取內容和向writeStream寫入內容
                int contentSize = readStream.Read(btArray, 0, btArray.Length); // 向遠程文件讀第一次
                while (contentSize > 0) // 如果讀取長度大於零則繼續讀
                {
                    writeStream.Write(btArray, 0, contentSize); // 寫入本地文件
                    contentSize = readStream.Read(btArray, 0, btArray.Length); // 繼續向遠程文件讀取
                }

                writeStream.Close();
                readStream.Close();
                flag = true; //返回true下載成功
            }
            catch (Exception exception)
            {
                writeStream.Close();
                Trace.Write($"Http方式下載文件失敗:{exception.Message}");
                message = $"下載數據文件失敗:{exception.Message}";
                flag = false; //返回false下載失敗
            }
            return flag;
        }
        public  string GetInfo(string URL)

        {
            string Results = "";

            long ContentL = 0;

            if (URL.ToLower().StartsWith("https://"))

            {

                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);

                request.MaximumAutomaticRedirections = 4;

                request.MaximumResponseHeadersLength = 4;

                request.Credentials = CredentialCache.DefaultCredentials;

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                ContentL = response.ContentLength;

                response.Close();

                Results += GetSize(ContentL);


            }

            else if (URL.ToLower().StartsWith("ftp://"))

            {

                FtpWebRequest request = (FtpWebRequest)WebRequest.Create(URL);

                request.Method = WebRequestMethods.Ftp.GetFileSize;

                request.UseBinary = true;

                FtpWebResponse response = null;

                response = (FtpWebResponse)request.GetResponse();

                Stream Fs = response.GetResponseStream();

                ContentL = response.ContentLength;

                Fs.Close();

                response.Close();

                Results += GetSize(ContentL);

            }

            else

            {

                Results += "無法檢測";

            }

            return Results;

        }
        //大小轉化  

        public  string GetSize(long L)

        {

            float result;

            //string re = "";

            if (L >= 1073741824)

            {

                result = L / 1073741824.00F;

                //re = "GB";

            }
            else if (L >= 1048576)

            {

                result = L / 1048576.00F;

                //re = "MB";

            }

            else

            {

                result = L / 1024.00F;

                //re = "KB";

            }

            string File_Size = result.ToString("0.00");

            return File_Size;

        }


        /// <summary>
        /// 從文件頭得到遠程文件的長度
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        private long GetHttpLength(string url)
        {
            long length = 0;

            try
            {
                HttpWebRequest req = (HttpWebRequest) WebRequest.Create(url);
                HttpWebResponse rsp = (HttpWebResponse) req.GetResponse();

                if (rsp.StatusCode == HttpStatusCode.OK)
                {
                    length = rsp.ContentLength;
                }

                rsp.Close();
                return length;
            }
            catch (Exception ex)
            {
                Trace.Write("從文件頭得到遠程文件的長度出現錯誤:" + ex.Message);
                return length;
            }
        }

        /// <summary>
        /// 解壓文件
        /// </summary>
        /// <param name="zipName">解壓文件路徑</param>
        /// <param name="fileDirName">解壓到文件夾的名稱</param>
        /// <returns></returns>
        public bool ZipToFile(string zipName, string fileDirName,out string message)
        {
            message = string.Empty;
            try
            {
                //讀取壓縮文件(zip文件),準備解壓縮
                ZipInputStream s = new ZipInputStream(File.Open(zipName.Trim(), FileMode.Open, FileAccess.Read));
                ZipEntry theEntry;

                string rootDir = " ";
                while ((theEntry = s.GetNextEntry()) != null)
                {
                    string path = fileDirName;
                    //獲取該文件在zip中目錄
                    rootDir = Path.GetDirectoryName(theEntry.Name);
                    //獲取文件名稱
                    string fileName = Path.GetFileName(theEntry.Name);
                    if (string.IsNullOrEmpty(fileName))
                    {
                        continue;
                    }

                    //判斷是否爲頂層文件,是,將文件直接放在fileDirName下,否,創建目錄
                    if (string.IsNullOrEmpty(rootDir))
                    {
                        if (!Directory.Exists(path))
                        {
                            Directory.CreateDirectory(path);
                        }
                    }
                    else
                    {
                        path += "\\" + rootDir;
                        if (!Directory.Exists(path))
                        {
                            Directory.CreateDirectory(path);
                        }
                    }

                    //將文件流寫入對應目錄下的文件中
                    if (fileName != string.Empty)
                    {
                        FileStream streamWriter = File.Create(path + "\\" + fileName);

                        int size = 2048;
                        byte[] data = new byte[2048];
                        while (true)
                        {
                            if (theEntry.Size == 0)
                            {
                                break;
                            }

                            size = s.Read(data, 0, data.Length);
                            if (size > 0)
                            {
                                streamWriter.Write(data, 0, size);
                            }
                            else
                            {
                                break;
                            }
                        }

                        streamWriter.Close();
                    }
                }

                s.Close();
                return true;
            }
            catch (Exception ex)
            {
                Trace.Write("解壓過程出現異常:" + ex.Message);
                message = "解壓過程出現異常:" + ex.Message;
                return false;
            }
        }
    }

 

3、 調用

  DownFileHelper downFileHelper = new DownFileHelper();
                    if (downFileHelper.Download(result.Data.ToString(), CommonUtil.GetCurrentDirectory() + @"temp.zip", out string message))
                    {
                        if (!downFileHelper.ZipToFile(CommonUtil.GetCurrentDirectory() + @"temp.zip", CommonUtil.GetCurrentDirectory(), out message))
                        {
                            DialogHelper.ShowInfo("提示", "解壓打印數據失敗:" + message, "確定");
                            Trace.Write("解壓打印數據失敗:" + message);
                            return;
                        }
                    }
                    else
                    {
                        DialogHelper.ShowInfo("提示", "下載打印數據失敗:" + message, "確定");
                        Trace.Write("下載打印數據失敗:" + message);
                        return;

                    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章