WebClient的上传文件一直报错,各种百度各种稀奇古怪的东西,终于百度到一篇小白学习篇

转自: https://www.cnblogs.com/cncc/p/5722231.html

使用C#WebClient类访问(上传/下载/删除/列出文件目录)由IIS搭建的http文件服务器

 

前言

为什么要写这边博文呢?其实,就是使用C#WebClient类访问由IIS搭建的http文件服务器的问题花了我足足两天的时间,因此,有必要写下自己所学到的,同时,也能让广大的博友学习学习一下。

本文足如有不足之处,请在下方留言提出,我会进行改正的,谢谢!

搭建IIS文件服务器

本博文使用的操作系统为Windows 10 企业版,其他Windows系统类似,请借鉴:

一、当然,开始肯定没有IIS,那该怎么办?需要一个软件环境进行搭建,具体方法如下:

1)打开“控制面板”,找到“程序与功能”,如下图所示:

2)点进去之后,找到“启用或关闭Windows功能”,如下图所示:

3)点进去之后,将“Internet Information Services”下所有节点都打勾(这样就搭建了一个功能完全的HTTP/FTP服务器),注意“WebDAV发布”必须要安装,这个跟文件服务器中文件访问权限有着很大的关系,如果想对服务器中某个具有读写权限的文件夹进行读写,就必须开启该选项,如下图所示:

4)等待安装完毕,请耐心等待, 如下图所示:

5)完成之后,点击“关闭”按钮即可,然后,打开“控制面板”,找到“管理工具”,如下图所示:

6)点击“管理工具”后,找到“Internet Information Services (IIS)管理器”,打开它,如下图所示:

7)进去之后,就已经进入了IIS的管理界面,我们只用到的功能为红色框内的IIS功能,如下图所示:

8)第一搭建IIS,会出现一个默认的Web网站,我们将鼠标移到“Default Web Site”上方,右键弹出菜单,在菜单中点击“删除”将该网站删除,如下图所示:

9)添加自己的一个网站,鼠标移到“网站”上方,右键点击鼠标,弹出菜单,在菜单中点击“添加网站”,如下图所示:

10)根据如下图所说的步骤,填写网站名称及选择物理路径,其他默认即可,然后点击“确定”按钮:

11)本网站仅作为文件服务器,因此,将服务器的文件浏览功能打开,以便浏览,具体操作为鼠标双击“目录浏览”后,将“操作”一栏里的“启用”打开,如下图所示:

12)鼠标双击“WebDAV创作规则”,如下图所示:

13)点击“WebDAV设置”,如下图所示:

14)将①②所示红色框内的属性设置为图中所示的属性,并点击“应用”,如下图所示:

15)返回到“WebDAV创作规则”,点击“添加创作规则”,如下图所示:

16)在弹出的“添加创作规则”,将“允许访问此内容”选中,权限“读取、源、写入”都打勾,点击“确定”按钮关闭,如下图所示:

17)返回到“WebDAV创作规则”,点击“启用WebDAV”,如下图所示:

18)双击“身份验证”,将“匿名身份验证”(客户端读取文件)及“Windows身份验证”(客户端写入、删除)启用,如下所示:

19)为了能让文件服务器具有写入、删除功能,可以在现有Windows系统账户上新建一个隶属于“Power Users”的账户“test”(密码:123),如下图所示:

以上关于如何创建账户的内容,请自行百度

20)为了能让test账户顺利访问存放于E盘下的“TestWebSite”文件夹,需要为该文件夹设置Power Users组的访问权限,如下图所示:

关于如何将特定组或用户设置权限的问题,请自行百度

21)查看本机IIS的IP地址,并在浏览器输入该IP,将会显示以下内容,如下图所示:

22)自此,IIS文件服务器的搭建已经完毕。

使用C#WebClient访问IIS文件服务器

本博文使用的的IDE为VS2015,在使用WebClient类之前,必须先引用System.Net命名空间,文件下载、上传与删除的都是使用异步编程,也可以使用同步编程,

这里以异步编程为例:

1)文件下载:

  1. static void Main(string[] args)
  2. {
  3. //定义_webClient对象
  4. WebClient _webClient = new WebClient();
  5. //使用默认的凭据——读取的时候,只需默认凭据就可以
  6. _webClient.Credentials = CredentialCache.DefaultCredentials;
  7. //下载的链接地址(文件服务器)
  8. Uri _uri = new Uri(@"http://192.168.1.103/test.doc");
  9. //注册下载进度事件通知
  10. _webClient.DownloadProgressChanged += _webClient_DownloadProgressChanged;
  11. //注册下载完成事件通知
  12. _webClient.DownloadFileCompleted += _webClient_DownloadFileCompleted;
  13. //异步下载到D盘
  14. _webClient.DownloadFileAsync(_uri, @"D:\test.doc");
  15. Console.ReadKey();
  16. }
  17.  
  18. //下载完成事件处理程序
  19. private static void _webClient_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
  20. {
  21. Console.WriteLine("Download Completed...");
  22. }
  23.  
  24. //下载进度事件处理程序
  25. private static void _webClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
  26. {
  27. Console.WriteLine($"{e.ProgressPercentage}:{e.BytesReceived}/{e.TotalBytesToReceive}");
  28. }

运行结果如下:

2)文件上传:

  1. static void Main(string[] args)
  2. {
  3. //定义_webClient对象
  4. WebClient _webClient = new WebClient();
  5. //使用Windows登录方式
  6. _webClient.Credentials = new NetworkCredential("test", "");
  7. //上传的链接地址(文件服务器)
  8. Uri _uri = new Uri(@"http://192.168.1.103/test.doc");
  9. //注册上传进度事件通知
  10. _webClient.UploadProgressChanged += _webClient_UploadProgressChanged;
  11. //注册上传完成事件通知
  12. _webClient.UploadFileCompleted += _webClient_UploadFileCompleted;
  13. //异步从D盘上传文件到服务器
  14. _webClient.UploadFileAsync(_uri,"PUT", @"D:\test.doc");
  15. Console.ReadKey();
  16. }
  17. //下载完成事件处理程序
  18. private static void _webClient_UploadFileCompleted(object sender, UploadFileCompletedEventArgs e)
  19. {
  20. Console.WriteLine("Upload Completed...");
  21. }
  22.  
  23. //下载进度事件处理程序
  24. private static void _webClient_UploadProgressChanged(object sender, UploadProgressChangedEventArgs e)
  25. {
  26. Console.WriteLine($"{e.ProgressPercentage}:{e.BytesSent}/{e.TotalBytesToSend}");
  27. }

运行结果如下:

3)文件删除:

  1. static void Main(string[] args)
  2. {
  3. //定义_webClient对象
  4. WebClient _webClient = new WebClient();
  5. //使用Windows登录方式
  6. _webClient.Credentials = new NetworkCredential("test", "");
  7. //待删除的文件链接地址(文件服务器)
  8. Uri _uri = new Uri(@"http://192.168.1.103/test.doc");
  9. //注册删除完成时的事件(模拟删除)
  10. _webClient.UploadDataCompleted += _webClient_UploadDataCompleted;
  11. //异步从文件(模拟)删除文件
  12. _webClient.UploadDataAsync(_uri, "DELETE", new byte[]);
  13. Console.ReadKey();
  14. }
  15. //删除完成事件处理程序
  16. private static void _webClient_UploadDataCompleted(object sender, UploadDataCompletedEventArgs e)
  17. {
  18. Console.WriteLine("Deleted...");
  19. }

运行结果如下:

4)列出文件(或目录):

需引入命名空间:System.IO、System.Xml及System.Globalization

  1. static void Main(string[] args)
  2. {
  3.  
  4. SortedList<string, ServerFileAttributes> _results =GetContents(@"http://192.168.1.103", true);
  5. //在控制台输出文件(或目录)信息:
  6. foreach(var _r in _results)
  7. {
  8. Console.WriteLine($"{_r.Key}:\r\nName:{_r.Value.Name}\r\nIsFolder:{_r.Value.IsFolder}");
  9. Console.WriteLine($"Value:{_r.Value.Url}\r\nLastModified:{_r.Value.LastModified}");
  10. Console.WriteLine();
  11. }
  12.  
  13. Console.ReadKey();
  14. }
  15.  
  16. //定义每个文件或目录的属性
  17. struct ServerFileAttributes
  18. {
  19. public string Name;
  20. public bool IsFolder;
  21. public string Url;
  22. public DateTime LastModified;
  23. }
  24.  
  25. //将文件或目录列出来
  26. static SortedList<string, ServerFileAttributes> GetContents(string serverUrl, bool deep)
  27. {
  28. HttpWebRequest _httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(serverUrl);
  29. _httpWebRequest.Headers.Add("Translate: f");
  30. _httpWebRequest.Credentials = CredentialCache.DefaultCredentials;
  31.  
  32. string _requestString = @"<?xml version=""1.0"" encoding=""utf-8""?>" +
  33. @"<a:propfind xmlns:a=""DAV:"">" +
  34. "<a:prop>" +
  35. "<a:displayname/>" +
  36. "<a:iscollection/>" +
  37. "<a:getlastmodified/>" +
  38. "</a:prop>" +
  39. "</a:propfind>";
  40.  
  41. _httpWebRequest.Method = "PROPFIND";
  42. if (deep == true)
  43. _httpWebRequest.Headers.Add("Depth: infinity");
  44. else
  45. _httpWebRequest.Headers.Add("Depth: 1");
  46. _httpWebRequest.ContentLength = _requestString.Length;
  47. _httpWebRequest.ContentType = "text/xml";
  48.  
  49. Stream _requestStream = _httpWebRequest.GetRequestStream();
  50. _requestStream.Write(Encoding.ASCII.GetBytes(_requestString), , Encoding.ASCII.GetBytes(_requestString).Length);
  51. _requestStream.Close();
  52.  
  53. HttpWebResponse _httpWebResponse;
  54. StreamReader _streamReader;
  55. try
  56. {
  57. _httpWebResponse = (HttpWebResponse)_httpWebRequest.GetResponse();
  58. _streamReader = new StreamReader(_httpWebResponse.GetResponseStream());
  59. }
  60. catch (WebException ex)
  61. {
  62. throw ex;
  63. }
  64.  
  65. StringBuilder _stringBuilder = new StringBuilder();
  66.  
  67. char[] _chars = new char[];
  68. int _bytesRead = ;
  69.  
  70. _bytesRead = _streamReader.Read(_chars, , );
  71.  
  72. while (_bytesRead > )
  73. {
  74. _stringBuilder.Append(_chars, , _bytesRead);
  75. _bytesRead = _streamReader.Read(_chars, , );
  76. }
  77. _streamReader.Close();
  78.  
  79. XmlDocument _xmlDocument = new XmlDocument();
  80. _xmlDocument.LoadXml(_stringBuilder.ToString());
  81.  
  82. XmlNamespaceManager _xmlNamespaceManager = new XmlNamespaceManager(_xmlDocument.NameTable);
  83. _xmlNamespaceManager.AddNamespace("a", "DAV:");
  84.  
  85. XmlNodeList _nameList = _xmlDocument.SelectNodes("//a:prop/a:displayname", _xmlNamespaceManager);
  86. XmlNodeList _isFolderList = _xmlDocument.SelectNodes("//a:prop/a:iscollection", _xmlNamespaceManager);
  87. XmlNodeList _lastModifyList = _xmlDocument.SelectNodes("//a:prop/a:getlastmodified", _xmlNamespaceManager);
  88. XmlNodeList _hrefList = _xmlDocument.SelectNodes("//a:href", _xmlNamespaceManager);
  89.  
  90. SortedList<string, ServerFileAttributes> _sortedListResult = new SortedList<string, ServerFileAttributes>();
  91. ServerFileAttributes _serverFileAttributes;
  92.  
  93. for (int i = ; i < _nameList.Count; i++)
  94. {
  95. if (_hrefList[i].InnerText.ToLower(new CultureInfo("en-US")).TrimEnd(new char[] { '/' }) != serverUrl.ToLower(new CultureInfo("en-US")).TrimEnd(new char[] { '/' }))
  96. {
  97. _serverFileAttributes = new ServerFileAttributes();
  98. _serverFileAttributes.Name = _nameList[i].InnerText;
  99. _serverFileAttributes.IsFolder = Convert.ToBoolean(Convert.ToInt32(_isFolderList[i].InnerText));
  100. _serverFileAttributes.Url = _hrefList[i].InnerText;
  101. _serverFileAttributes.LastModified = Convert.ToDateTime(_lastModifyList[i].InnerText);
  102. _sortedListResult.Add(_serverFileAttributes.Url, _serverFileAttributes);
  103. }
  104. }
  105. return _sortedListResult;
  106. }

运行结果如下:

WebClient上传下载文件,小白篇的更多相关文章

  1. webclient上传下载文件

    定义WebClient使用的操作类: 操作类名称WebUpDown WebClient上传文件至Ftp服务: //// <summary> /// WebClient上传文件至Ftp服务 ...

  2. C#实现http协议支持上传下载文件的GET、POST请求

    C#实现http协议支持上传下载文件的GET.POST请求using System; using System.Collections.Generic; using System.Text; usin ...

  3. WebSSH画龙点睛之lrzsz上传下载文件

    本篇文章没有太多的源码,主要讲一下实现思路和技术原理 当使用Xshell或者SecureCRT终端工具时,我的所有文件传输工作都是通过lrzsz来完成的,主要是因为其简单方便,不需要额外打开sftp之 ...

  4. rz和sz上传下载文件工具lrzsz

    ######################### rz和sz上传下载文件工具lrzsz ####################################################### ...

  5. WebClient上传音频文件

    //WebClient上传音频文件 public string UploadVoice(string fileNamePath) { Voice model=new Voice(); string s ...

  6. linux上很方便的上传下载文件工具rz和sz

    linux上很方便的上传下载文件工具rz和sz(本文适合linux入门的朋友) ##########################################################&l ...

  7. shell通过ftp实现上传/下载文件

    直接代码,shell文件名为testFtptool.sh: #!/bin/bash ########################################################## ...

  8. SFTP远程连接服务器上传下载文件-qt4.8.0-vs2010编译器-项目实例

    本项目仅测试远程连接服务器,支持上传,下载文件,更多功能开发请看API自行开发. 环境:win7系统,Qt4.8.0版本,vs2010编译器 qt4.8.0-vs2010编译器项目实例下载地址:CSD ...

  9. linux下常用FTP命令 上传下载文件【转】

    1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码 ...

随机推荐

  1. Java中的享元设计模式,涨姿势了!

    首先来看一段代码: public class ShareTest {   public static void main(String[] args) {     Integer a = 127;   ...

  2. equals与== 和toString方法

    /** * equals()方法的使用 * * 1.java.lang.Object类中的equals()方法的定义: * * public boolean equals(Object obj) { ...

  3. C++ Primer: 1. 初识输入和输出

    C++没有定义任何的输入和输出语句,而是使用了 标准库来提供IO机制---iostream; 标准库iostream定义了4种不同的IO对象: cin:     标准输入对象:instream类型的对 ...

  4. 文件的三种打开方式及with管理文件上下文

    文件的三种打开方式及with管理文件上下文 一.文件的三种打开方式 1.1 只读 f = open(r'D:\pycharm\yjy\上海python学习\456.txt','r',encoding= ...

  5. mysql小数和类型转换函数

    保留两位小数 SELECT ROUND( 123456789.3563898,2),TRUNCATE(123456789.3563898,2),FORMAT(123456789.3563898,2); ...

  6. 扇形导航 css3

    本篇文章将通过对css3中的2d变化以及过渡进行分析设计 先放上最终效果图                 功能实现:1.给扇形home元素设置点击事件并添加2d旋转 2.给导航栏设置2d旋转 并通过 ...

  7. jquery preventDefault() 方法防止打开不是本站的链接URL

    将以下代码保存为test.html,用浏览器打开即可测试 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

  8. JS获取当前日期和时间的方法,并按照YYYY-MM-DD格式化

    Js获取当前日期时间及其它操作 var myDate = new Date(); myDate.getYear();        //获取当前年份(2位) myDate.getFullYear(); ...

  9. VMware导入ova报错

    报错如下: 此主机支持Intel VT-x,但Intel VT-x处于禁用状态.   解决方案如下: 联想E75主机,重启按F1进入BIOS Advanced—>CPU setup—>In ...

  10. Mac SIP系统完整性保护如何关闭

    方法/步骤1: 打开Mac终端输入命令:csrutil status 它会显示关闭的话是disable,开启的话是enabled.默认情况下是开启的所以要关闭. 方法/步骤2: 点击桌面的apple ...