[ 登录注册 ]

语言

再看ftp上传文件

2017-07-14 09:39:55 admin 返回上一页

标签:class   blog   http   com   get   使用   

前言

      去年在项目中用到ftp上传文件,用FtpWebRequest和FtpWebResponse封装一个帮助类,这个在网上能找到很多,前台使用Uploadify控件,然后在服务器上搭建Ftp服务器,在本地测试程序上传到ftp服务器一点问题都没有,奇怪的是当发布Web和ftp到同一个IIS下,上传文件时程序直接卡死,然后页面卡死,后来我又发现把Web和ftp分开发布在两台机器上问题又得到解决,所以当时放弃了这个方案。

 

再看ftp上传文件

      前几天偶然看到Wolfy写到一个项目总结,其中提到了用ServerU搭建服务器,突然想起来,以前还弄过ServerU呢,然后我重新做了测试。 我直接把Wolfy的FtpHelper拿出来测试,大致浏览了下程序,主要思路还是利用FtpWebRequest和FtpWebResponse来实现。

public class FTPHelper{#region 字段/// <summary>/// ftp地址,带ftp协议/// </summary>private string strFtpURI;/// <summary>/// ftp用户名/// </summary>private string strFtpUserID;/// <summary>/// ftp的ip地址/// </summary>private string strFtpServerIP;/// <summary>/// ftp用户登录密码/// </summary>private string strFtpPassword;/// <summary>/// ftp目录路径/// </summary>private string strFtpRemotePath;#endregion/// <summary>/// 连接FTP服务器/// </summary>/// <param name="strFtpServerIP">FTP连接地址</param>/// <param name="strFtpRemotePath">指定FTP连接成功后的当前目录 如果不指定即默认为根目录</param>/// <param name="strFtpUserID">用户名</param>/// <param name="strFtpPassword">密码</param>public FTPHelper(string strFtpServerIP string strFtpRemotePath string strFtpUserID string strFtpPassword){this.strFtpServerIP = strFtpServerIP;this.strFtpRemotePath = strFtpRemotePath;this.strFtpUserID = strFtpUserID;this.strFtpPassword = strFtpPassword;this.strFtpURI = "ftp://" + strFtpServerIP + strFtpRemotePath;}/// <summary>/// 上载/// </summary>/// <param name="strFilename">本地文件路径</param>/// <param name="strSavePath">ftp服务器文件保存路径</param>public void Upload(string strFilename string strSavePath){FileInfo fileInf = new FileInfo(strFilename);FtpWebRequest reqFTP;reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(strFtpURI + strSavePath + fileInf.Name));reqFTP.Credentials = new NetworkCredential(strFtpUserID strFtpPassword);reqFTP.Method = WebRequestMethods.Ftp.UploadFile;reqFTP.KeepAlive = false;reqFTP.UseBinary = true;reqFTP.Proxy = null;reqFTP.ContentLength = fileInf.Length;int buffLength = 2048;byte[] buff = new byte[buffLength];int contentLen;FileStream fs = fileInf.OpenRead();try{Stream strm = reqFTP.GetRequestStream();contentLen = fs.Read(buff 0 buffLength);while (contentLen != 0){strm.Write(buff 0 contentLen);contentLen = fs.Read(buff 0 buffLength);}strm.Close();fs.Close();}catch (Exception ex){throw new Exception(ex.Message);}}public void Upload(HttpPostedFile filestring strSavePath){FtpWebRequest reqFTP;//请求的 URI 对于此 FTP 命令无效reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(strFtpURI + strSavePath+file.FileName));reqFTP.Credentials = new NetworkCredential(strFtpUserID strFtpPassword);reqFTP.Method = WebRequestMethods.Ftp.UploadFile;reqFTP.KeepAlive = false;reqFTP.UseBinary = true;reqFTP.Proxy = null;int buffLength = 2048;byte[] buff = new byte[buffLength];Stream stream = file.InputStream;Stream requestStream = reqFTP.GetRequestStream();int len = stream.Read(buff 0 buff.Length);while (len > 0){requestStream.Write(buff 0 buffLength);len = stream.Read(buff 0 buffLength);}stream.Close();requestStream.Close();stream.Dispose();requestStream.Dispose();}/// <summary>/// 上载/// </summary>/// <param name="strFilename">本地文件路径</param>/// <param name="strSavePath">ftp服务器文件保存路径</param>/// <param name="strStrOldName">ftp服务器文件保存的名字</param>public void Upload(string strFilename string strSavePath string strStrOldName){FileInfo fileInf = new FileInfo(strFilename);FtpWebRequest reqFTP;reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(strFtpURI + strSavePath + strStrOldName));reqFTP.Credentials = new NetworkCredential(strFtpUserID strFtpPassword);reqFTP.Method = WebRequestMethods.Ftp.UploadFile;reqFTP.KeepAlive = false;reqFTP.UseBinary = true;reqFTP.Proxy = null;reqFTP.ContentLength = fileInf.Length;int buffLength = 2048;byte[] buff = new byte[buffLength];int contentLen;FileStream fs = fileInf.OpenRead();try{Stream strm = reqFTP.GetRequestStream();contentLen = fs.Read(buff 0 buffLength);while (contentLen != 0){strm.Write(buff 0 contentLen);contentLen = fs.Read(buff 0 buffLength);}strm.Close();fs.Close();}catch (Exception ex){throw new Exception(ex.Message);}}/// <summary>/// 下载/// </summary>/// <param name="strFilePath">本地保存路径</param>/// <param name="strFileName">文件名</param>/// <param name="strFileName">本地临时名称</param>public void Download(string strFilePath string strFileName string strLocalName){try{FileStream outputStream = new FileStream(strFilePath + strLocalName FileMode.Create);FtpWebRequest reqFTP;reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(strFtpURI + strFileName));reqFTP.Credentials = new NetworkCredential(strFtpUserID strFtpPassword);reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;reqFTP.UseBinary = true;reqFTP.UsePassive = true;reqFTP.Proxy = null;FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();Stream ftpStream = response.GetResponseStream();long cl = response.ContentLength;int bufferSize = 2048;int readCount;byte[] buffer = new byte[bufferSize];readCount = ftpStream.Read(buffer 0 bufferSize);while (readCount > 0){outputStream.Write(buffer 0 readCount);readCount = ftpStream.Read(buffer 0 bufferSize);}ftpStream.Close();outputStream.Close();response.Close();}catch (Exception ex){}}/// <summary>/// 下载/// </summary>/// <param name="strFilePath">本地保存路径</param>/// <param name="strFileName">文件名</param>public void Download(string strFilePath string strFileName){try{FileStream outputStream = new FileStream(strFilePath + strFileName FileMode.Create);FtpWebRequest reqFTP;reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(strFtpURI + strFileName));reqFTP.Credentials = new NetworkCredential(strFtpUserID strFtpPassword);reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;reqFTP.UseBinary = true;reqFTP.UsePassive = true;reqFTP.Proxy = null;FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();Stream ftpStream = response.GetResponseStream();long cl = response.ContentLength;int bufferSize = 2048;int readCount;byte[] buffer = new byte[bufferSize];readCount = ftpStream.Read(buffer 0 bufferSize);while (readCount > 0){outputStream.Write(buffer 0 readCount);readCount = ftpStream.Read(buffer 0 bufferSize);}ftpStream.Close();outputStream.Close();response.Close();}catch (Exception ex){}}/// <summary>/// 删除文件/// </summary>/// <param name="strFileName">文件名</param>public void Delete(string strFileName){try{FtpWebRequest reqFTP;reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(strFtpURI + strFileName));reqFTP.Credentials = new NetworkCredential(strFtpUserID strFtpPassword);reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;reqFTP.KeepAlive = false;string result = String.Empty;FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();long size = response.ContentLength;Stream datastream = response.GetResponseStream();StreamReader sr = new StreamReader(datastream);result = sr.ReadToEnd();sr.Close();datastream.Close();response.Close();}catch (Exception ex){throw new Exception(ex.Message);}}/// <summary>/// 获取当前目录下明细(包含文件和文件夹)/// </summary>/// <returns></returns>public string[] GetFilesDetailList(){try{StringBuilder result = new StringBuilder();FtpWebRequest ftp;ftp = (FtpWebRequest)FtpWebRequest.Create(new Uri(strFtpURI));ftp.Credentials = new NetworkCredential(strFtpUserID strFtpPassword);ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;WebResponse response = ftp.GetResponse();StreamReader reader = new StreamReader(response.GetResponseStream());string line = reader.ReadLine();line = reader.ReadLine();line = reader.ReadLine();while (line != null){result.Append(line);result.Append("
");line = reader.ReadLine();}result.Remove(result.ToString().LastIndexOf("
") 1);reader.Close();response.Close();return result.ToString().Split(‘
‘);}catch (Exception ex){throw new Exception(ex.Message);}}/// <summary>///  获取FTP文件列表(包括文件夹)/// </summary>/// <param name="strUrl"></param>/// <returns></returns>private string[] GetAllList(string strUrl){List<string> list = new List<string>();FtpWebRequest req = (FtpWebRequest)WebRequest.Create(new Uri(strUrl));req.Credentials = new NetworkCredential(strFtpPassword strFtpPassword);req.Method = WebRequestMethods.Ftp.ListDirectory;req.UseBinary = true;req.UsePassive = true;try{using (FtpWebResponse res = (FtpWebResponse)req.GetResponse()){using (StreamReader sr = new StreamReader(res.GetResponseStream())){string s;while ((s = sr.ReadLine()) != null){list.Add(s);}}}}catch (Exception ex){throw (ex);}return list.ToArray();}/// <summary>/// 获取当前目录下文件列表(不包括文件夹)/// </summary>public string[] GetFileList(string strUrl){StringBuilder result = new StringBuilder();FtpWebRequest reqFTP;try{reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(strUrl));reqFTP.UseBinary = true;reqFTP.Credentials = new NetworkCredential(strFtpPassword strFtpPassword);reqFTP.Method = WebRequestMethods.Ftp.ListDirectoryDetails;WebResponse response = reqFTP.GetResponse();StreamReader reader = new StreamReader(response.GetResponseStream());string line = reader.ReadLine();while (line != null){if (line.IndexOf("<DIR>") == -1){result.Append(Regex.Match(line @"[S]+ [S]+" RegexOptions.IgnoreCase).Value.Split(‘ ‘)[1]);result.Append("
");}line = reader.ReadLine();}result.Remove(result.ToString().LastIndexOf(‘
‘) 1);reader.Close();response.Close();}catch (Exception ex){throw (ex);}return result.ToString().Split(‘
‘);}/// <summary>/// 判断当前目录下指定的文件是否存在/// </summary>/// <param name="strRemoteFileName">远程文件名</param>public bool FileExist(string strRemoteFileName){string[] fileList = GetFileList("*.*");foreach (string str in fileList){if (str.Trim() == strRemoteFileName.Trim()){return true;}}return false;}/// <summary>/// 创建文件夹/// </summary>/// <param name="strDirName">目录名</param>public void MakeDir(string strDirName){FtpWebRequest reqFTP;try{reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(strFtpURI + strDirName));reqFTP.Method = WebRequestMethods.Ftp.MakeDirectory;reqFTP.UseBinary = true;reqFTP.Credentials = new NetworkCredential(strFtpUserID strFtpPassword);FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();Stream ftpStream = response.GetResponseStream();ftpStream.Close();response.Close();}catch (Exception ex){}}/// <summary>/// 获取指定文件大小/// </summary>public long GetFileSize(string strFilename){FtpWebRequest reqFTP;long fileSize = 0;try{reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(strFtpURI + strFilename));reqFTP.Method = WebRequestMethods.Ftp.GetFileSize;reqFTP.UseBinary = true;reqFTP.Credentials = new NetworkCredential(strFtpUserID strFtpPassword);FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();Stream ftpStream = response.GetResponseStream();fileSize = response.ContentLength;ftpStream.Close();response.Close();}catch (Exception ex){ throw ex; }return fileSize;}/// <summary>/// 更改文件名/// </summary>public void ReName(string strCurrentFilename string strNewFilename){FtpWebRequest reqFTP;try{reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(strFtpURI + strCurrentFilename));reqFTP.Method = WebRequestMethods.Ftp.Rename;reqFTP.RenameTo = strNewFilename;reqFTP.UseBinary = true;reqFTP.Credentials = new NetworkCredential(strFtpUserID strFtpPassword);FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();Stream ftpStream = response.GetResponseStream();ftpStream.Close();response.Close();}catch (Exception ex){ throw ex; }}/// <summary>/// 移动文件/// </summary>public void MovieFile(string strCurrentFilename string strNewDirectory){ReName(strCurrentFilename strNewDirectory);}/// <summary>/// 切换当前目录/// </summary>/// <param name="bIsRoot">true:绝对路径 false:相对路径</param>public void GotoDirectory(string strDirectoryName bool bIsRoot){if (bIsRoot){strFtpRemotePath = strDirectoryName;}else{strFtpRemotePath += strDirectoryName + "/";}strFtpURI = "ftp://" + strFtpServerIP + "/" + strFtpRemotePath + "/";}}

  

对两个上传方法的测试

       其中包含3个Upload方法,两个方法第一个参数都是本地文件的绝对路径,但是在Web页面中使用file控件在后台是得不到文件绝对路径的,只能得到文件名,于是我加了第三个方法,直接用HttpPostedFile作为方法的第一个参数,用属性InputStream作为输入流。  关于这个我问下Wolfy他是怎么调用的,他是把上传的文件先存到Web站点下,然后再上传到ftp服务器上,方法可行,我没有想到,太笨了。

public void Upload(HttpPostedFile filestring strSavePath){FtpWebRequest reqFTP;//请求的 URI 对于此 FTP 命令无效reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(strFtpURI + strSavePath+file.FileName));reqFTP.Credentials = new NetworkCredential(strFtpUserID strFtpPassword);reqFTP.Method = WebRequestMethods.Ftp.UploadFile;reqFTP.KeepAlive = false;reqFTP.UseBinary = true;reqFTP.Proxy = null;int buffLength = 2048;byte[] buff = new byte[buffLength];Stream stream = file.InputStream;Stream requestStream = reqFTP.GetRequestStream();int len = stream.Read(buff 0 buff.Length);while (len > 0){requestStream.Write(buff 0 buffLength);len = stream.Read(buff 0 buffLength);}stream.Close();requestStream.Close();stream.Dispose();requestStream.Dispose();}

 

ServerU安装和配置教程

     参考:  http://www.cnblogs.com/wolf-sun/p/3749683.html

 

总结

     上传方法我直接使用HttpPostedFile测试通过,并且发布到IIS上测试通过,也可以将文件上传到web站点下再上传到ftp服务器中。Ftp服务器使用ServerU搭建。再次在测试过程中感谢Wolfy对问题的指导和回复。

 

再看ftp上传文件布布扣bubuko.com

再看ftp上传文件

标签:class   blog   http   com   get   使用   


文章来源:http://www.bozhiyue.com/yuyan/2017/0714/1484233.html
返回上一页    返回分类 上一篇:   下一篇:
相关