FTP概述 文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议,作为一套古老的网络工具,在工业界有着及其广泛的应用.本节主要给大家演示ftp对文件的上传、下载、以及删除。如果还没有ftp服务地址,请参考上节【使用filezilla server搭建ftp服务器】搭建下服务器。 效果演示 代码 先定义配置模型:FTPConfig
public class FTPConfig { /// <summary> /// /// </summary> public FTPConfig() { IsUpload = false; FtpServerIP = "127.0.0.1"; FtpRemotePath = ""; FtpUserID = "ftpTest"; FtpPassword = "a123456."; }
/// <summary> /// 是否上传 /// </summary> public bool IsUpload { get; set; }
/// <summary> /// FTP的IP地址 /// </summary> public string FtpServerIP { get; set; }
/// <summary> /// 上传FTP目录 /// </summary> public string FtpRemotePath { get; set; }
/// <summary> /// 用户名 /// </summary> public string FtpUserID { get; set; }
/// <summary> /// 密码 /// </summary> public string FtpPassword { get; set; } }
FTP上传、下载、删除方法:
/// <summary> /// 上传 /// </summary> /// <param name="filename"></param> public void Upload(string filename) { if (ftpConfig.IsUpload) { FileInfo fileInfo = new FileInfo(filename); string uri = ftpURI + fileInfo.Name; FtpWebRequest reqFTP;
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri)); reqFTP.Credentials = new NetworkCredential(ftpConfig.FtpUserID, ftpConfig.FtpPassword); reqFTP.KeepAlive = false; reqFTP.Method = WebRequestMethods.Ftp.UploadFile; reqFTP.UseBinary = true; reqFTP.ContentLength = fileInfo.Length;
int buffLength = 2048; byte[] buff = new byte[buffLength]; int contentLen; using (FileStream fs = fileInfo.OpenRead()) { using (Stream strm = reqFTP.GetRequestStream()) { try { 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) { string errorMessage = "Upload Error --> " + ex.Message; //logger.Error(errorMessage); throw; } } } } else { //logger.Debug("[UploadData] uploadConfig.IsUpload is false,abort to loaddata"); } }
/// <summary> /// 下载 /// </summary> /// <param name="filePath"></param> /// <param name="fileName"></param> public void Download(string filePath, string fileName) { FtpWebRequest reqFTP; try { FileStream outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create);
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(ftpURI + fileName)); reqFTP.Method = WebRequestMethods.Ftp.DownloadFile; reqFTP.UseBinary = true; reqFTP.Credentials = new NetworkCredential(ftpConfig.FtpUserID, ftpConfig.FtpPassword); 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) { string errorMessage = "Download Error --> " + ex.Message; //logger.Error(errorMessage); throw; } }
/// <summary> /// 删除文件 /// </summary> /// <param name="fileName"></param> public void Delete(string fileName) { try { string uri = ftpURI + fileName; FtpWebRequest reqFTP; reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));
reqFTP.Credentials = new NetworkCredential(ftpConfig.FtpUserID, ftpConfig.FtpPassword); reqFTP.KeepAlive = false; reqFTP.Method = WebRequestMethods.Ftp.DeleteFile;
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) { string errorMessage = "Delete Error --> " + ex.Message + " 文件名:" + fileName; //logger.Error(errorMessage); throw; } }
前台写了三个button,分别进行上传、下载、删除操作:
<StackPanel> <Button Name="Upload" Content="FTP 上传"/> <Button Name="Download" Content="FTP 下载"/> <Button Name="Delete" Content="FTP 删除"/> </StackPanel>
后台事件:
public void Upload() { ftpConfig.IsUpload = true; Upload(@"D:\temp.png"); MessageBox.Show("上传完成!!!"); }
public void Download() { Download(@"D:\", "temp.png"); MessageBox.Show("下载完成!!!"); }
public void Delete() { Delete("temp.png"); MessageBox.Show("删除完成!!!"); }
公共属性和类的初始化:
private string ftpURI; private FTPConfig ftpConfig { get; set; }
/// <summary> /// 连接FTP /// </summary> /// <param name="ftpConfig"></param> public FTPTestViewModel(FTPConfig ftpConfig) { this.ftpConfig = ftpConfig; if (string.IsNullOrEmpty(this.ftpConfig.FtpRemotePath)) { ftpURI = "ftp://" + this.ftpConfig.FtpServerIP + "/"; } else { ftpURI = "ftp://" + this.ftpConfig.FtpServerIP + "/" + this.ftpConfig.FtpRemotePath + "/"; } }
此外本项目还封装了ftp进行删除文件夹、获取当前目录下明细(包含文件和文件夹)、/ 获取当前目录下文件列表(仅文件)、获取当前目录下所有的文件夹列表(仅文件夹)、判断当前目录下指定的子目录是否存在、判断当前目录下指定的文件是否存在、创建文件夹、获取指定文件大小、改名、 移动文件、切换当前目录、 删除订单目录等方法,这这里不再列举,需要学习的可以下载源码参考。 源码下载 链接:https://pan.baidu.com/s/1F7EIi7bOcQVKhlKFFv-uEA 提取码:在下面这个公众号对话框发送【ftp】,
|