WebClient 从服务器下载/获取文件方式

  今天主要记录、分享 使用WebClient 下载/获取 文件的两种方式。  

  话不多说,放置代码。

  第一种:使用 WebClient 自封装方法: DownloadFile();  下载方便、直接。

        /// <summary>
        /// 下载文件(WebClient.DownloadFile)
        /// </summary>
        /// <param name="downFileUrl">下载文件链接地址</param>
        /// <param name="savePath">保存路径</param>
        /// <returns></returns>
        public static string DownLoadFileByWebClientStatic(string downFileUrl, string savePath)
        {
            string result = string.Empty;
            try
            {
                WebClient wcClient = new WebClient();
                wcClient.DownloadFile(downFileUrl, savePath);
                result = "下载成功";
            }
            catch (WebException ex)
            {
                result = $"下载失败!Error={ ex.Message}";
            }
            return result;
        }

        /// <summary>
        /// 下载文件(wcClient.DownloadFileAsync)
        /// </summary>
        /// <param name="downFileUrl">下载文件链接地址</param>
        /// <param name="savePath">保存路径</param>
        /// <returns></returns>
        public static string DownLoadFileMethod(string downFileUrl, string savePath)
        {
            string result = string.Empty;
            try
            {
                WebClient wcClient = new WebClient();
                wcClient.DownloadDataCompleted += (t, s) =>
                {
                    result = "下载成功";//不会直接返回(无状态?)
                };
                wcClient.DownloadFileAsync(new Uri(downFileUrl), savePath);
            }
            catch (WebException ex)
            {
                result = $"下载失败!Error={ ex.Message}";
            }
            return result;
        }

  第二种:使用读取文件流形式下载/获取文件。(自测通过)

     /// <summary>
        /// 下载文件(Stream 形式处理)
        /// </summary>
        /// <param name="downFileUrl">下载文件链接地址</param>
        /// <param name="savePath">保存路径</param>
        /// <returns></returns>
        public static string DownLoadFileByWebClient(string downFileUrl, string savePath)
        {
            string result = string.Empty;
            try
            {
                WebClient wcClient = new WebClient();

                WebRequest webReq = WebRequest.Create(downFileUrl);
                WebResponse webRes = webReq.GetResponse();
                long fileLength = webRes.ContentLength;
                Stream srm = webRes.GetResponseStream();
                StreamReader srmReader = new StreamReader(srm);

                byte[] bufferbyte = new byte[fileLength];
                int allByte = (int)bufferbyte.Length;
                int startByte = 0;
                while (fileLength > 0)
                {
                    int downByte = srm.Read(bufferbyte, startByte, allByte);
                    if (downByte == 0) break;
                    startByte += downByte;
                    allByte -= downByte;
                }
                //检测保存文件所在目录是否存在
                if (!File.Exists(savePath))
                {
                    string[] dirArray = savePath.Split(‘\\‘);
                    string temp = string.Empty;
                    for (int i = 0; i < dirArray.Length - 1; i++)
                    {
                        temp += dirArray[i].Trim() + "\\";
                        if (!Directory.Exists(temp))
                            Directory.CreateDirectory(temp);
                    }
                }

                using (FileStream fsSave = new FileStream(savePath, FileMode.OpenOrCreate, FileAccess.Write))
                {
                    fsSave.Write(bufferbyte, 0, bufferbyte.Length);
                    fsSave.Dispose();
                }

                //与using 方法两者等同。
                //FileStream fs = new FileStream(savePath, FileMode.OpenOrCreate, FileAccess.Write);
                //fs.Write(bufferbyte, 0, bufferbyte.Length);
                srm.Close();
                srmReader.Close();
                //fs.Close();

                result = $"下载成功 path={savePath}";
            }
            catch (WebException ex)
            {
                result = $"下载失败!Error={ ex.Message}";
            }
            return result;
        }
        

     第二种 通过文件流 下载,方法分支:(使用WebClient 的 OpenRead() 方式获取到Stream ,然后进行文件流读取,不知为何,自测失败,下载的文件无法正常打开)。 现在还没有找到合理解释,希望大家评论。    

 /// <summary>
        /// 下载文件
        /// </summary>
        /// <param name="URLAddress">资源URL</param>
        /// <param name="saveBasePath">保存根目录/目录</param>
        /// <returns></returns>
        public string DownFileByStream(string URLAddress, string saveBasePath)
        {
            string result = string.Empty;
            try
            {
                WebClient client = new WebClient();
                Stream str = client.OpenRead(URLAddress);
                StreamReader reader = new StreamReader(str);

                byte[] bytes = new byte[1024 * 1024];//自定义大小 1M
                int allybytes = (int)bytes.Length;
                int startbytes = 0;

                while (allybytes > 0)
                {
                    int m = str.Read(bytes, startbytes, allybytes);  //获取当前读取字节位置
                    if (m == 0)
                        break;
                    startbytes += m;
                    allybytes -= m;
                }

                reader.Dispose();
                str.Dispose();

                string path = saveBasePath + System.IO.Path.GetFileName(URLAddress);
                FileStream fsWrite = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);
                fsWrite.Write(bytes, 0, startbytes);
                fsWrite.Flush();
                fsWrite.Close();

                result = "下载成功!";
            }
            catch (Exception ex)
            {
                result = "下载失败!" + ex.Message;
            }
            return result;
        }

    如有不合理之处,欢迎指出。以上就是今天的记录;本文大部分内容都可以搜到,只是此处做了一个小整理。

    如果您觉得本文对您有帮助,欢迎点击“收藏”按钮!(/:微笑)欢迎转载,转载请注明出处。

原文地址:https://www.cnblogs.com/skyheaving/p/12499629.html

时间: 2024-10-11 22:59:38

WebClient 从服务器下载/获取文件方式的相关文章

WPF中利用WebClient向服务器上传文件

转载:原文地址http://blog.csdn.net/wj1589300/article/details/9255631 WPF中利用WebClient向服务器上传文件 忽然接到一个任务,在WPF中上传文件至服务器~在网上搜了很多种方法,最终决定利用WebCient实现文件的上传工作,看似很简单的任务,却遇到了很多问题.先说一下我的探索步骤吧~ 一.选用WebClient.UploadFile方法 (String,String, String) [csharp] view plaincopyp

wp8通过WebClient从服务器下载文件

通过WebClient从Web服务器下载文件,并保存到wp8手机应用程序的独立存储. 我们可以通过利用webClient_DownloadStringCompleted来获得下载完成所需要的时间,用Stopwatch得到下载的总时间. 通常我们都将上传.下载作为异步事件来处理,以便不阻止主线程. String url = "http://172.18.144.248:8080/upload/" + filename; WebClient client = new WebClient()

跨服务器上传文件方式

跨服务器上传文件的方式有很多,其中一种是使用在中间服务器上使用临时文件的方式进行保存后再发送到另一个服务器上,实现文件上传. 问题点:中间保存临时文件,还需要不定时的进行文件清理,比较麻烦 直接进行文件的转发,使用byte[]数组方式直接进行文件转发,然后,服务器根据传递的byte[]数组进行转文件方式,使用httpclient方式将byte[]数组发送到服务端,特别注意的点在于, 发送的时候使用"content-type" = "application/json"

使用.net FtpWebRequest 实现FTP常用功能 上传 下载 获取文件列表 移动 切换目录 改名 .

平时根本没时间搞FTP什么的,现在这个项目需要搞FTP,为什么呢,我给大家说下项目背景,我们的一个应用程序上需要上传图片,但是用户部署程序的服务器上不让上传任何东西,给了我们一个FTP账号和密码,让我们把图片保存到另一台所谓的文件服务器上面. 建立ftp通信,写入文件流,ok ,  但是显示的时候就麻烦了,不能直接写<img src = "ftp://121.131.131.1" />这样的代码啊,因为这样写的话,你浏览的时候还要登陆Ftp账户,每次都要弹出一个用户登陆框,

关于IIS服务器下载新文件类型提示找不到文件的问题

在IIS6中新增可下载文件类型 IIS 6.0 不能处理未知的 MIME 类型 IIS6 只为对具有已知文件扩展名的文件的请求提供服务.如果请求内容的文件扩展名未映射到已知的扩展,则服务器拒绝请求.即IIS不支持未知文件扩展下载! 当您从 IIS 6.0 Web 服务器中请求文件时,而该文件的扩展名不是 Web 服务器上已定义的 MIME 类型,您将看到以下错误消息: HTTP 错误 404 - 找不到文件或目录. 原因 IIS 早期版本包含通配符 MIME 映射,允许 IIS 处理任何文件而无

定时从远程FTP服务器下载txt文件并导入本地Oracle数据库

集团内的业务数据以前是采用 地区采集—集团清洗-分发地区的ETL流程,自从集团成立软件公司以后,子公司需要的业务数据都必须向集团申请而来,但是业务系统底层DC也没提供相应的数据接口,所以就有了这次需求原型:从远程FTP服务器上定时获取txt数据文件,并将数据导入到本地Oracle数据库. 每天需要从FTP下载的txt文件有40-50个,除第一次全量数据文件在10G左右较大.下载耗时较长外,后续的增量文件都在500M以内. 需要使用到的技术.工具:FTPClient.Java多线程.Oracle提

Java从不同目录获取文件方式

demo ├─src │    └─com │            └─rgsc│                    └─xml │                          ├─XmlRead.java │                          └─stu.xml 1. 错误方式: String filePath="src/com/rgsc/xml/stu.xml"; File f = newFile(filePath); 发布为jar包后读取就会失败,因此

asp.net从服务器(指定文件夹)下载任意格式的文件到本地

一.我需要从服务器下载ppt文件到本地 protected void Btn_DownPPT_Click(object sender, EventArgs e)        {            DBService svc = new DBService();            svc.DownPpts();            string strFileName = "公报.ppt";            string filename = Context.Serve

使用tftpd32搭建PXE服务器——从FTP服务器下载内核及INITRD文件

必备工具 tftpd32-4.5.0 syslinux-6.0.3 vmware workstation 以上工具都可以从网上下载到,版本可以用最新的. 详细步骤 1.创建一个文件夹如D:/PXE_BOOT/,解压syslinux源码包,在源码包中搜索找到ldlinux.c32.lpxelinux.0.pxelinux.0并拷贝到D:/PXE_BOOT/目录中. 2.在D:/PXE_BOOT/下创建一个pxelinux.cfg文件夹,这里要放类似于isolinux.cfg的配置文件,其实完全可以