winform 文件上传,及错误集锦

来源:互联网 发布:比思论坛备用域名 编辑:程序博客网 时间:2024/06/05 08:30

要实现winform的文件上传功能,ftp什么的暂时不会,上网找了许多,最后搞出来了,不算是原创,但把一些东西总结在了一起

        #region 上传、下载类        /// <summary>        /// winform形式的文件传输类        /// </summary>        public class WinFileTransporter        {            /// <summary>            /// WebClient上传文件至服务器,默认不自动改名            /// </summary>            /// <param name="fileNamePath">文件名,全路径格式</param>            /// <param name="uriString">服务器文件夹路径</param>            public string UpLoadFile(string fileNamePath, string uriString)            {                return UpLoadFile(fileNamePath, uriString, true);            }            /// <summary>            /// WebClient上传文件至服务器            /// </summary>            /// <param name="fileNamePath">文件名,全路径格式</param>            /// <param name="uriString">服务器文件夹路径</param>            /// <param name="IsAutoRename">是否自动按照时间重命名</param>            /// 返回 上传文件名            public string UpLoadFile(string fileNamePath, string uriString, bool IsAutoRename)            {                string fileName = fileNamePath.Substring(fileNamePath.LastIndexOf("\\") + 1);                string NewFileName = fileName;                if (IsAutoRename)                {                    NewFileName = DateTime.Now.ToString("yyMMddhhmmssfff") + DateTime.Now.Millisecond.ToString() + fileNamePath.Substring(fileNamePath.LastIndexOf("."));                }                string fileNameExt = fileName.Substring(fileName.LastIndexOf(".") + 1);                if (uriString.EndsWith("/") == false) uriString = uriString + "/";                uriString = uriString + NewFileName;                /// 创建WebClient实例                WebClient myWebClient = new WebClient();                myWebClient.Credentials = CredentialCache.DefaultCredentials;                // 要上传的文件                FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read);                //FileStream fs = OpenFile();                BinaryReader r = new BinaryReader(fs);                try                {                    ////使用UploadFile方法可以用下面的格式                    //myWebClient.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");                    //myWebClient.UploadFile(uriString, "PUT", fileNamePath);                    byte[] postArray = r.ReadBytes((int)fs.Length);                    Stream postStream = myWebClient.OpenWrite(uriString, "PUT");                    if (postStream.CanWrite)                    {                        postStream.Write(postArray, 0, postArray.Length);                    }                    else                    {                        MessageBox.Show("文件目前不可写!");                    }                    postStream.Flush();                    //postStream.Dispose();                    postStream.Close();                    return NewFileName;                }                catch (Exception err)                {                    throw err;                }                finally                {                    fs.Dispose();                }            }            /**/            /// <summary>            /// 下载服务器文件至客户端            /// </summary>            /// <param name="URL">被下载的文件地址,绝对路径</param>            /// <param name="Dir">另存放的目录</param>            /// 返回 下载文件路径            public string Download(string URL, string Dir)            {                WebClient client = new WebClient();                string fileName = URL.Substring(URL.LastIndexOf("/") + 1);  //被下载的文件名                string Path = Dir + fileName;   //另存为的绝对路径+文件名                try                {                    WebRequest myre = WebRequest.Create(URL);                }                catch (Exception err)                {                   // throw err;                    return "";                }                try                {                    client.DownloadFile(URL, Path);                  //  FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);                 //   BinaryReader r = new BinaryReader(fs);                  //  byte[] mbyte = r.ReadBytes((int)fs.Length);                 //   FileStream fstr = new FileStream(Path, FileMode.OpenOrCreate, FileAccess.Write);                 //   fstr.Write(mbyte, 0, (int)fs.Length);                 //   fstr.Close();                    return Path;                }                catch (Exception err)                {                   // throw err;                    return "";                }            }        }        #endregion
以上是实现文件上传下载的类,

一.“远程服务器返回错误: (501) 未实现”的错误

解决方法:
Web服务扩展中的WebDAV惹得祸,将IIS的"Web服务扩展"中的"WebDAV"设置成"允许"!
PS:iis6的 webdav支持 其实就是个基于http的ftp功能 ,明确iis不能直接上传文件,需要扩展支持的话应该不会饶弯路吧?

二.“远程服务器返回错误 (403) 已禁止”的错误

解决方法:

进入网站的虚拟路径目录,虚拟目录属性给写入权限;

三.“远程服务器返回错误: (401) 未经授权”的错误

解决方法:

1、错误号401.1    
症状:HTTP   错误   401.1   -   未经授权:访问由于凭据无效被拒绝。    
分析:    
由于用户匿名访问使用的账号(默认是IUSR_机器名)被禁用,或者没有权限访问计算机,将造成用户无法访问。    
解决方案:    
(1)查看IIS管理器中站点安全设置的匿名帐户是否被禁用,如果是,请尝试用以下办法启用:    
控制面板->管理工具->计算机管理->本地用户和组,将IUSR_机器名账号启用。如果还没有解决,请继续下一步。    
(2)查看本地安全策略中,IIS管理器中站点的默认匿名访问帐号或者其所属的组是否有通过网络访问服务器的权限,如果没有尝试用以下步骤赋予权限:    
开始->程序->管理工具->本地安全策略->安全策略->本地策略->用户权限分配,双击“从网络访问此计算机”,添加IIS默认用户或者其所属的组。    
注意:一般自定义   IIS默认匿名访问帐号都属于组,为了安全,没有特殊需要,请遵循此规则。
2、错误号401.2    
症状:HTTP   错误   401.2   -   未经授权:访问由于服务器配置被拒绝。    
原因:关闭了匿名身份验证    
解决方案:    
运行inetmgr,打开站点属性->目录安全性->身份验证和访问控制->选中“启用匿名访问”,输入用户名,或者点击“浏览”选择合法的用户,并两次输入密码后确定。
3、错误号:401.3    
症状:HTTP   错误   401.3   -   未经授权:访问由于   ACL   对所请求资源的设置被拒绝。    
原因:IIS匿名用户一般属于Guests组,而我们一般把存放网站的硬盘的权限只分配给administrators组,这时候按照继承原则,网站文件夹也只有administrators组的成员才能访问,导致IIS匿名用户访问该文件的NTFS权限不足,从而导致页面无法访问。    
解决方案:    
给IIS匿名用户访问网站文件夹的权限,方法:进入该文件夹的安全选项,添加IIS匿名用户,并赋予相应权限,一般是读、写

自己还遇到一些情况,就是服务器上装有杀毒软件或是其他安全软件时,即使权限全开,也会跳403异常,原因是向服务器的写入操作会被杀毒软件拦截,(有的杀毒软件竟然不提示,这个问题找了一上午,一直以为IIS设置有问题),这个需要相应设置了