FTP作为日常工作学习中,非常重要的一个文件传输存储空间,想必大家都非常的熟悉了,那么如何快速的实现文件的上传下载功能呢,本文以一个简单的小例子,简述如何通过FluentFTP实现文件的上传和下载功能。仅供学习分享使用,如有不足之处,还请指正。
FTP基础知识
文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议,它工作在 OSI 模型的第七层, TCP 模型的第四层, 即应用层, 使用 TCP 传输而不是 UDP, 客户在和服务器建立连接前要经过一个“三次握手”的过程, 保证客户与服务器之间的连接是可靠的, 而且是面向连接, 为数据传输提供可靠保证。FTP允许用户以文件操作的方式(如文件的增、删、改、查、传送等)与另一主机相互通信。然而, 用户并不真正登录到自己想要存取的计算机上面而成为完全用户, 可用FTP程序访问远程资源, 实现用户往返传输文件、目录管理以及访问电子邮件等等, 即使双方计算机可能配有不同的操作系统和文件存储方式。
FTP环境搭建
在windows操作系统中,FTP可以通过(Internet Inforamtion Services, IIS)管理器进行创建,创建成功后即可进行查看,如下所示:

FluentFTP安装
FluentFTP是一款基于.Net的FTP和FTPS的客户端动态库,操作简单便捷。

首先创建基于.Net Framework 4.6.1的winform应用程序,然后通过Nuget包管理器进行安装,如下所示:

示例演示
主要实现基于FTP的上传,下载,浏览等功能,如下所示:

进入文件夹及右键下载,如下所示:

示例源码
FtpHelper类源码,封装了FTP文件的检索,上传,下载等功能,如下所示:
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Net;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- using FluentFTP;
-
- namespace DemoFtp
- {
- public class FtpHelper
- {
- #region 属性与构造函数
-
- /// <summary>
- /// IP地址
- /// </summary>
- public string IpAddr { get; set; }
-
- /// <summary>
- /// 相对路径
- /// </summary>
- public string RelatePath { get; set; }
-
- /// <summary>
- /// 端口号
- /// </summary>
- public int Port { get; set; }
-
- /// <summary>
- /// 用户名
- /// </summary>
- public string UserName { get; set; }
-
- /// <summary>
- /// 密码
- /// </summary>
- public string Password { get; set; }
-
- public FtpHelper()
- {
-
- }
-
- public FtpHelper(string ipAddr, int port, string userName, string password, string relatePath)
- {
- this.IpAddr = ipAddr;
- this.Port = port;
- this.UserName = userName;
- this.Password = password;
- this.RelatePath = relatePath;
- }
-
- #endregion
-
- #region 方法
-
- public FtpListItem[] ListDir() {
- FtpListItem[] lists;
- using (var ftpClient = new FtpClient(this.IpAddr, this.UserName, this.Password, this.Port))
- {
- ftpClient.Connect();
- ftpClient.SetWorkingDirectory(this.RelatePath);
- lists = ftpClient.GetListing();
- }
- return lists;
- }
-
- public void UpLoad(string dir, string file, out bool isOk)
- {
- isOk = false;
- FileInfo fi = new FileInfo(file);
- using (FileStream fs = fi.OpenRead())
- {
- //long length = fs.Length;
- using (var ftpClient = new FtpClient(this.IpAddr, this.UserName, this.Password, this.Port))
- {
- ftpClient.Connect();
- ftpClient.SetWorkingDirectory(this.RelatePath);
- string remotePath = dir + "/" + Path.GetFileName(file);
- var ftpRemodeExistsMode = file.EndsWith(".txt") ? FtpRemoteExists.Overwrite : FtpRemoteExists.Skip;
- FtpStatus status = ftpClient.UploadStream(fs, remotePath, ftpRemodeExistsMode, true);
- isOk = status == FtpStatus.Success;
-
- }
- }
-
- }
-
- /// <summary>
- /// 上传多个文件
- /// </summary>
- /// <param name="files"></param>
- /// <param name="isOk"></param>
- public void UpLoad(string dir, string[] files, out bool isOk)
- {
- isOk = false;
- if (CheckDirIsExists(dir))
- {
- foreach (var file in files)
- {
- UpLoad(dir, file, out isOk);
- }
- }
- }
-
-
- private bool CheckDirIsExists(string dir)
- {
- bool flag = false;
- using (var ftpClient = new FtpClient(this.IpAddr, this.UserName, this.Password, this.Port))
- {
- ftpClient.Connect();
- ftpClient.SetWorkingDirectory(this.RelatePath);
- flag = ftpClient.DirectoryExists(dir);
- if (!flag)
- {
- flag = ftpClient.CreateDirectory(dir);
- }
- }
- return flag;
-
-
- }
-
- /// <summary>
- /// 下载ftp
- /// </summary>
- /// <param name="localAddress"></param>
- /// <param name="remoteAddress"></param>
- /// <returns></returns>
- public bool DownloadFile(string localAddress, string remoteAddress)
- {
- using (var ftpClient = new FtpClient(this.IpAddr, this.UserName, this.Password, this.Port))
- {
- ftpClient.SetWorkingDirectory("/");
- ftpClient.Connect();
- if (ftpClient.DownloadFile(localAddress, remoteAddress) == FtpStatus.Success)
- {
- return true;
- }
- return false;
- }
- }
-
- #endregion
- }
- }
每一个FTP文件或文件夹,由一个自定义用户控件【PictureBox+Label+ContextMenu】表示,这样便于处理与显示:
- using DemoFtp.Properties;
- using FluentFTP;
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
-
- namespace DemoFtp
- {
- public partial class FtpElementControl : UserControl
- {
- public Action<FtpListItem> SubFolderClick;
-
- public Action<FtpListItem> DownLoadClick;
-
- private FtpListItem ftpListItem;
-
- public FtpElementControl(FtpListItem ftpListItem)
- {
- InitializeComponent();
- this.ftpListItem = ftpListItem;
- }
-
- public FtpElementControl()
- {
- InitializeComponent();
- }
-
- public void InitControl()
- {
- if (ftpListItem.Type == FtpObjectType.Directory)
- {
- this.pbIcon.Image = Resources.folder.ToBitmap();
- }
- else if (ftpListItem.Type == FtpObjectType.File)
- {
- var name = ftpListItem.Name;
- var ext = Path.GetExtension(name).ToLower().Substring(1);
- if (ext == "png" || ext == "jpeg" || ext == "jpg" || ext == "bmp" || ext == "gif")
- {
- this.pbIcon.Image = Resources.pictures.ToBitmap();
- }
- else if (ext == "doc" || ext == "docx")
- {
- this.pbIcon.Image = Resources.doc.ToBitmap();
- }
- else if (ext == "exe")
- {
- this.pbIcon.Image = Resources.setup.ToBitmap();
- }
- else
- {
- this.pbIcon.Image = Resources.file;
- }
- }
- else
- {
- this.pbIcon.Image = Resources.file;
- }
- this.lblName.Text = ftpListItem.Name;
- }
-
- private void FtpElementControl_Load(object sender, EventArgs e)
- {
-
- }
-
- /// <summary>
- /// 子菜单下载功能
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void menu_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
- {
- this.DownLoadClick?.Invoke(ftpListItem);
- }
-
- /// <summary>
- /// 双击打开
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void pbIcon_DoubleClick(object sender, EventArgs e)
- {
- this.SubFolderClick?.Invoke(ftpListItem);
- }
- }
- }
主页面由一系列用户操作框和按钮组成,完成对FTP的基本操作,如下所示:
- using FluentFTP;
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
-
- namespace DemoFtp
- {
- public partial class MainForm : Form
- {
- private FtpHelper ftpHelper;
-
- public MainForm()
- {
- InitializeComponent();
- }
-
- private void btnLogin_Click(object sender, EventArgs e)
- {
- var url = txtFtpUrl.Text;
- var userName = txtUserName.Text;
- var password = txtPassword.Text;
- var port = txtPort.Text;
- if (this.lblRelatePath.Text != "/")
- {
- this.lblRelatePath.Text = "/";
- }
- var relatePath = this.lblRelatePath.Text;
- if (string.IsNullOrEmpty(url) || string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(password) || string.IsNullOrEmpty(port))
- {
- MessageBox.Show("路径和账号密码不可为空");
- return;
- }
- if (ftpHelper == null)
- {
- ftpHelper = new FtpHelper(url, int.Parse(port), userName, password, relatePath);
-
- }
- ListDir();
- }
-
- public void SubFolder(FtpListItem ftpListItem)
- {
- if (ftpListItem.Type == FtpObjectType.Directory)
- {
- var fullName = ftpListItem.FullName;
- ftpHelper.RelatePath = fullName;
- ListDir();
- this.lblRelatePath.Text = fullName;
- }
- }
-
-
- private void Download(FtpListItem ftpListItem) {
- var fullName=ftpListItem.FullName;
- var fileName = Path.GetFileName(fullName);
- SaveFileDialog sfd = new SaveFileDialog();
- sfd.FileName = fileName;
- sfd.Title = "不载";
- sfd.Filter = "所有文档|*.*";
- if (DialogResult.OK == sfd.ShowDialog()) {
- ftpHelper.DownloadFile(sfd.FileName, fullName);
- }
- }
-
- private void ListDir()
- {
- this.ftpContainer.Controls.Clear();
- var ftpListItems = this.ftpHelper.ListDir();
- if (ftpListItems != null && ftpListItems.Length > 0)
- {
- foreach (var ftpListItem in ftpListItems)
- {
- FtpElementControl ftpControl = new FtpElementControl(ftpListItem);
- ftpControl.InitControl();
- ftpControl.DownLoadClick += Download;
- ftpControl.SubFolderClick += SubFolder;
- this.ftpContainer.Controls.Add(ftpControl);
- }
- }
- }
-
- private void btnUpload_Click(object sender, EventArgs e)
- {
- OpenFileDialog ofd = new OpenFileDialog();
- ofd.Filter = "所有文件|*.*";
- ofd.Title = "请选择需要上传的文件";
- if (DialogResult.OK == ofd.ShowDialog()) {
- var localFile=ofd.FileName;
- ftpHelper.UpLoad(this.lblRelatePath.Text, localFile, out bool isOk);
- if (isOk) {
- ListDir();
- }
- }
- }
-
- private void pbReturn_Click(object sender, EventArgs e)
- {
- var relativePath=this.lblRelatePath.Text;
- if (relativePath == "/") {
- return;
- }
- relativePath = relativePath.Substring(0, relativePath.LastIndexOf("/")+1);
- ftpHelper.RelatePath=relativePath;
- ListDir();
- this.lblRelatePath.Text = relativePath;
- }
- }
- }
以上就是C#利用FluentFTP实现FTP上传下载功能详解的详细内容,更多关于C# FTP上传下载的资料请关注w3xue其它相关文章!