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;

                    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值