FTP文件上传以及获取ftp配置帮助类
帮助类:
using QSProjectBase; using Reform.CommonLib; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; namespace Reform.CommonLib { ////// ftp操作 /// public class FtpHelper { ////// 上传文件 /// /// 上传文件的全路径 /// 上传类 ///public static bool UploadFile(FileInfo fileinfo, string ftpPath) { try { if (fileinfo == null || string.IsNullOrEmpty(ftpPath)) return false; string url = ftpPath; if (url.Contains("/") || url.Contains("\\")) { var str = url.Split(new Char[] { '/', '\\' }); var dic = url.Replace(str[str.Length - 1], ""); CheckAndMakeDir(dic); } System.Net.FtpWebRequest ftp = GetRequest(url); //设置FTP命令 设置所要执行的FTP命令, //ftp.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails;//假设此处为显示指定路径下的文件列表 ftp.Method = System.Net.WebRequestMethods.Ftp.UploadFile; ftp.UseBinary = true; ftp.UsePassive = true; ftp.ContentLength = fileinfo.Length; const int BufferSize = 20480; //缓冲大小设置为20KB byte[] content = new byte[BufferSize - 1 + 1]; int dataRead; using (FileStream fs = fileinfo.OpenRead()) { try { using (Stream rs = ftp.GetRequestStream()) { do { dataRead = fs.Read(content, 0, BufferSize); rs.Write(content, 0, dataRead); } while (!(dataRead < BufferSize)); rs.Close(); } } catch (Exception) { } finally { fs.Close(); } } ftp = null; ////设置FTP命令 //ftp = GetRequest(URI); //ftp.Method = System.Net.WebRequestMethods.Ftp.Rename; //改名 //ftp.RenameTo = fileinfo.Name; //try //{ // ftp.GetResponse(); //} //catch (Exception ex) //{ // ftp = GetRequest(URI); // ftp.Method = System.Net.WebRequestMethods.Ftp.DeleteFile; //删除 // ftp.GetResponse(); //} //ftp = null; return true; } catch (Exception) { return false; } } /// /// 上传文件 /// /// 上传文件的全路径 /// 上传的目录(包括文件名) /// 进度帮助 ///public static bool UploadFile(FileInfo fileinfo, string ftpPath, ProgressHelper progressHelper, MessageProgressHandler handler) { try { if (fileinfo == null || string.IsNullOrEmpty(ftpPath)) return false; string url = ftpPath; if (url.Contains("/") || url.Contains("\\")) { var str = url.Split(new Char[] { '/', '\\' }); var dic = url.Replace(str[str.Length - 1], ""); CheckAndMakeDir(dic); } System.Net.FtpWebRequest ftp = GetRequest(url); //设置FTP命令 设置所要执行的FTP命令, //ftp.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails;//假设此处为显示指定路径下的文件列表 ftp.Method = System.Net.WebRequestMethods.Ftp.UploadFile; ftp.UseBinary = true; ftp.UsePassive = false; ftp.ContentLength = fileinfo.Length; const int BufferSize = 20480; //缓冲大小设置为20KB byte[] content = new byte[BufferSize - 1 + 1]; int dataRead; using (FileStream fs = fileinfo.OpenRead()) { long fileLen = fs.Length; if (progressHelper != null && handler != null) { progressHelper.SetProgress(handler, "正在上传...", 0); } try { long proValue = 0; using (Stream rs = ftp.GetRequestStream()) { do { dataRead = fs.Read(content, 0, BufferSize); rs.Write(content, 0, dataRead); proValue += dataRead; if (progressHelper != null && handler != null) { progressHelper.SetProgress(handler, "正在上传...", (int)((double)proValue * 100 / fileLen)); } } while (!(dataRead < BufferSize)); var aa = rs.Length; rs.Close(); } } catch (Exception) { } finally { fs.Close(); } } ftp = null; ////设置FTP命令 //ftp = GetRequest(URI); //ftp.Method = System.Net.WebRequestMethods.Ftp.Rename; //改名 //ftp.RenameTo = fileinfo.Name; //try //{ // ftp.GetResponse(); //} //catch (Exception ex) //{ // ftp = GetRequest(URI); // ftp.Method = System.Net.WebRequestMethods.Ftp.DeleteFile; //删除 // ftp.GetResponse(); //} //ftp = null; return true; } catch (Exception) { return false; } } /// /// 下载文件 /// /// 下载到本地(全路径) /// 要下载的附件类 public static bool DownloadFile(string localFilePath, string ftpPath) { if (string.IsNullOrEmpty(ftpPath)) return false; if (string.IsNullOrEmpty(localFilePath)) return false; System.Net.FtpWebRequest ftp = null; try { string Url = ftpPath; string localDir = new FileInfo(localFilePath).DirectoryName; if (!Directory.Exists(localDir)) { Directory.CreateDirectory(localDir); } string tmpname = Guid.NewGuid().ToString(); string tmpFilePath = localDir + @"\" + tmpname; ftp = GetRequest(Url); // MsgBoxShow.ShowInformation(Url); ftp.Method = System.Net.WebRequestMethods.Ftp.DownloadFile; ftp.UseBinary = true; ftp.UsePassive = false; using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse()) { using (Stream responseStream = response.GetResponseStream()) { using (FileStream fs = new FileStream(tmpFilePath, FileMode.CreateNew)) { var aa = ftp.ContentLength; try { byte[] buffer = new byte[20480]; int read = 0; do { read = responseStream.Read(buffer, 0, buffer.Length); fs.Write(buffer, 0, read); } while (!(read == 0)); responseStream.Close(); fs.Flush(); fs.Close(); } catch (Exception) { fs.Close(); File.Delete(tmpFilePath); return false; } } responseStream.Close(); } response.Close(); } try { File.Delete(localFilePath); File.Move(tmpFilePath, localFilePath); ftp = null; } catch (Exception) { File.Delete(tmpFilePath); return false; } ftp = null; return true; } catch (WebException e) { Common_LogManager.RecordLog(LogType.Error, e.Message, e); if (e.Status == WebExceptionStatus.ProtocolError) { Console.WriteLine("Status Code : {0}", ((FtpWebResponse)e.Response).StatusCode); Console.WriteLine("Status Description : {0}", ((FtpWebResponse)e.Response).StatusDescription); } return false; } } ////// 下载文件,叠加 /// /// 下载到本地(全路径) /// 要下载的附件类 public static bool DownloadFileEx(string localFilePath, string ftpPath) { if (string.IsNullOrEmpty(ftpPath)) return false; if (string.IsNullOrEmpty(localFilePath)) return false; try { string Url = ftpPath; System.Net.FtpWebRequest ftp = GetRequest(Url); ftp.Method = System.Net.WebRequestMethods.Ftp.DownloadFile; ftp.UseBinary = true; ftp.UsePassive = false; using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse()) { using (Stream responseStream = response.GetResponseStream()) { using (FileStream fs = new FileStream(localFilePath, FileMode.Append)) { try { byte[] buffer = new byte[20480]; int read = 0; do { read = responseStream.Read(buffer, 0, buffer.Length); fs.Write(buffer, 0, read); } while (!(read == 0)); responseStream.Close(); fs.Flush(); fs.Close(); } catch (Exception) { fs.Close(); return false; } } responseStream.Close(); } response.Close(); } try { ftp = null; } catch (Exception) { return false; } ftp = null; return true; } catch (Exception) { return false; } } ////// 下载文件(包含进度) /// /// 下载到本地(全路径) /// 要下载的附件类 public static bool DownloadFile(string localFilePath, string ftpPath, ProgressHelper progressHelper, MessageProgressHandler handler) { if (string.IsNullOrEmpty(ftpPath)) return false; if (string.IsNullOrEmpty(localFilePath)) return false; try { string URI = ftpPath; string localDir = new FileInfo(localFilePath).DirectoryName; string tmpname = Guid.NewGuid().ToString(); string tmpFilePath = localDir + @"\" + tmpname; System.Net.FtpWebRequest ftp = GetRequest(URI); ftp.Method = System.Net.WebRequestMethods.Ftp.DownloadFile; ftp.UseBinary = true; ftp.UsePassive = false; long fileLen = GetFileSize(ftpPath); using (WebResponse response = ftp.GetResponse()) { using (Stream responseStream = response.GetResponseStream()) { if (progressHelper != null && handler != null) { progressHelper.SetProgress(handler, "正在下载...", 0); } using (FileStream fs = new FileStream(tmpFilePath, FileMode.OpenOrCreate)) { try { long proValue = 0; byte[] buffer = new byte[20480]; int read = 0; do { read = responseStream.Read(buffer, 0, buffer.Length); fs.Write(buffer, 0, read); proValue += read; if (progressHelper != null && handler != null) { progressHelper.SetProgress(handler, "正在下载...", (int)((double)proValue * 100 / fileLen)); } } while (!(read == 0)); responseStream.Close(); fs.Flush(); fs.Close(); } catch (Exception) { fs.Close(); File.Delete(tmpFilePath); return false; } } responseStream.Close(); } response.Close(); } try { File.Delete(localFilePath); File.Move(tmpFilePath, localFilePath); ftp = null; } catch (Exception ex) { File.Delete(tmpFilePath); return false; } ftp = null; return true; } catch (Exception) { return false; } } ////// 删除文件 /// /// 要删除的附件全路径 public static bool DeleteFile(string ftpPath) { if (string.IsNullOrEmpty(ftpPath)) return false; try { string URI = ftpPath; System.Net.FtpWebRequest ftp = GetRequest(URI); ftp.Method = System.Net.WebRequestMethods.Ftp.DeleteFile; ftp.UseBinary = true; ftp.UsePassive = false; using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse()) { using (Stream responseStream = response.GetResponseStream()) { responseStream.Close(); } response.Close(); } ftp = null; return true; } catch (Exception) { return false; } } ////// 搜索远程文件 /// /// 文件夹 /// 搜索模式 ///public static List<string> ListDirectory(string targetDir, string SearchPattern) { List<string> result = new List<string>(); try { string URI = targetDir + "/" + SearchPattern; System.Net.FtpWebRequest ftp = GetRequest(URI); ftp.Method = System.Net.WebRequestMethods.Ftp.ListDirectory; ftp.UsePassive = true; ftp.UseBinary = true; string str = GetStringResponse(ftp); str = str.Replace("\r\n", "\r").TrimEnd('\r'); str = str.Replace("\n", "\r"); if (str != string.Empty) result.AddRange(str.Split('\r')); return result; } catch { } return null; } private static string GetStringResponse(FtpWebRequest ftp) { string result = ""; using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse()) { long size = response.ContentLength; using (Stream datastream = response.GetResponseStream()) { using (StreamReader sr = new StreamReader(datastream, System.Text.Encoding.Default)) { result = sr.ReadToEnd(); sr.Close(); } datastream.Close(); } response.Close(); } return result; } public static void CheckAndMakeDir(string dirName) { if (string.IsNullOrEmpty(dirName)) { return; } if (dirName.Contains("/") || dirName.Contains("\\")) { var str = dirName.Split(new Char[] { '/', '\\' }); if (str.Length == 0 || string.IsNullOrEmpty(str[0])) { return; } string dir = str[0] + "/"; if (!IsExistsFile(dir)) MakeDir(dir); for (int i = 1; i < str.Length; i++) { if (string.IsNullOrEmpty(str[i])) { continue; } dir += (str[i] + "/"); if (!IsExistsFile(dir)) MakeDir(dir); } } else { if (!IsExistsFile(dirName)) MakeDir(dirName); } } /// /// 在ftp服务器上创建目录 /// /// 创建的目录名称 public static void MakeDir(string dirName) { try { System.Net.FtpWebRequest ftp = GetRequest(dirName); ftp.Method = WebRequestMethods.Ftp.MakeDirectory; FtpWebResponse response = (FtpWebResponse)ftp.GetResponse(); response.Close(); } catch (Exception ex) { //MessageBox.Show(ex.Message); } } /// /// 删除目录 /// /// 删除目录名称 public static bool delDir(string dirName) { try { System.Net.FtpWebRequest ftp = GetRequest(dirName); ftp.Method = WebRequestMethods.Ftp.RemoveDirectory; FtpWebResponse response = (FtpWebResponse)ftp.GetResponse(); response.Close(); return true; } catch (Exception ex) { return false; } } ////// 文件重命名 /// /// 当前目录名称 /// 重命名目录名称 public static bool Rename(string currentFilename, string newFilename) { try { FileInfo fileInf = new FileInfo(currentFilename); System.Net.FtpWebRequest ftp = GetRequest(fileInf.Name); ftp.Method = WebRequestMethods.Ftp.Rename; ftp.RenameTo = newFilename; FtpWebResponse response = (FtpWebResponse)ftp.GetResponse(); response.Close(); return true; } catch (Exception ex) { return false; } } private static FtpWebRequest GetRequest(string dirName) { string url = "ftp://" + ConfigHepler.FtpServer + "/" + dirName; //根据服务器信息FtpWebRequest创建类的对象 FtpWebRequest result = (FtpWebRequest)FtpWebRequest.Create(url); //提供身份验证信息 result.Credentials = new System.Net.NetworkCredential(ConfigHepler.FtpUser, ConfigHepler.FtpPwd); //设置请求完成之后是否保持到FTP服务器的控制连接,默认值为true result.KeepAlive = false; return result; } ////// 判断ftp服务器上该目录是否存在 /// /// ///public static bool IsExistsFile(string dirName) { bool flag = true; try { System.Net.FtpWebRequest ftp = GetRequest(dirName); ftp.Method = WebRequestMethods.Ftp.ListDirectory; FtpWebResponse response = (FtpWebResponse)ftp.GetResponse(); response.Close(); } catch (Exception) { flag = false; } return flag; } // 获取文件大小 public static long GetFileSize(string ftpPath) { long size = 0; if (string.IsNullOrEmpty(ftpPath)) return size; try { string URI = ftpPath; System.Net.FtpWebRequest ftp = GetRequest(URI); ftp.Method = System.Net.WebRequestMethods.Ftp.GetFileSize; ftp.UseBinary = true; ftp.UsePassive = false; using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse()) { size = response.ContentLength; } } catch (Exception) { } return size; } } /// /// 从配置文件获取配置信息 /// public class ConfigHepler { private static string m_FtpServer; private static string m_FtpUser; private static string m_FtpPwd; ////// ftp服务器 /// public static string FtpServer { get { if (string.IsNullOrEmpty(m_FtpServer)) { string[] ftpConfigs = GlobalVars.FtpConfig.Split(new char[] { ';' }); if (ftpConfigs != null && ftpConfigs.Length > 0) m_FtpServer = ftpConfigs[0]; } return m_FtpServer; } } ////// ftp用户名 /// public static string FtpUser { get { if (string.IsNullOrEmpty(m_FtpUser)) { string[] ftpConfigs = GlobalVars.FtpConfig.Split(new char[] { ';' }); if (ftpConfigs != null && ftpConfigs.Length > 1) m_FtpUser = ftpConfigs[1]; } return m_FtpUser; } } ////// ftp密码 /// public static string FtpPwd { get { if (string.IsNullOrEmpty(m_FtpPwd)) { string[] ftpConfigs = GlobalVars.FtpConfig.Split(new char[] { ';' }); if (ftpConfigs != null && ftpConfigs.Length > 2) m_FtpPwd = ftpConfigs[2]; } return m_FtpPwd; } } } }
配置文件配置:
例子:
上传调用例子:
FileInfo fInfo = new FileInfo(txtDoc.Text); //上传到ftp的完整目录,FTP目录+文件格式+日期+GUID+文件名+文件后缀 ftpPath = M_FTPDIRECTORY + m_Archives.DocType.Replace(".", "") + "/" + DateTime.Now.ToString("yyyyMMdd") + "/" + Guid.NewGuid().ToString() + "/" + m_Archives.DocName + m_Archives.DocType; bool suc = FtpHelper.UploadFile(fInfo, ftpPath);