欢乐马桶 发表于 2023-2-21 12:44:25

C# 利用FluentFTP实现FTP上传下载功能

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文件的检索,上传,下载等功能,如下所示:
1 using System;
2 using System.Collections.Generic;
3 using System.IO;
4 using System.Linq;
5 using System.Net;
6 using System.Text;
7 using System.Threading;
8 using System.Threading.Tasks;
9 using FluentFTP;
10
11 namespace DemoFtp
12 {
13   public class FtpHelper
14   {
15         #region 属性与构造函数
16
17         /// <summary>
18         /// IP地址
19         /// </summary>
20         public string IpAddr { get; set; }
21
22         /// <summary>
23         /// 相对路径
24         /// </summary>
25         public string RelatePath { get; set; }
26
27         /// <summary>
28         /// 端口号
29         /// </summary>
30         public int Port { get; set; }
31
32         /// <summary>
33         /// 用户名
34         /// </summary>
35         public string UserName { get; set; }
36
37         /// <summary>
38         /// 密码
39         /// </summary>
40         public string Password { get; set; }
41
42         public FtpHelper()
43         {
44
45         }
46
47         public FtpHelper(string ipAddr, int port, string userName, string password, string relatePath)
48         {
49             this.IpAddr = ipAddr;
50             this.Port = port;
51             this.UserName = userName;
52             this.Password = password;
53             this.RelatePath = relatePath;
54         }
55
56         #endregion
57
58         #region 方法
59
60         public FtpListItem[] ListDir() {
61             FtpListItem[] lists;
62             using (var ftpClient = new FtpClient(this.IpAddr, this.UserName, this.Password, this.Port))
63             {
64               ftpClient.Connect();
65               ftpClient.SetWorkingDirectory(this.RelatePath);
66               lists = ftpClient.GetListing();
67             }
68             return lists;
69         }
70
71         public void UpLoad(string dir, string file, out bool isOk)
72         {
73             isOk = false;
74             FileInfo fi = new FileInfo(file);
75             using (FileStream fs = fi.OpenRead())
76             {
77               //long length = fs.Length;
78               using (var ftpClient = new FtpClient(this.IpAddr, this.UserName, this.Password, this.Port))
79               {
80                     ftpClient.Connect();
81                     ftpClient.SetWorkingDirectory(this.RelatePath);
82                     string remotePath = dir + "/" + Path.GetFileName(file);
83                     var ftpRemodeExistsMode = file.EndsWith(".txt") ? FtpRemoteExists.Overwrite : FtpRemoteExists.Skip;
84                     FtpStatus status = ftpClient.UploadStream(fs, remotePath, ftpRemodeExistsMode, true);
85                     isOk = status == FtpStatus.Success;
86
87               }
88             }
89         
90         }
91
92         /// <summary>
93         /// 上传多个文件
94         /// </summary>
95         /// <param name="files"></param>
96         /// <param name="isOk"></param>
97         public void UpLoad(string dir, string[] files, out bool isOk)
98         {
99             isOk = false;
100             if (CheckDirIsExists(dir))
101             {
102               foreach (var file in files)
103               {
104                     UpLoad(dir, file, out isOk);
105               }
106             }
107         }
108
109
110         private bool CheckDirIsExists(string dir)
111         {
112             bool flag = false;
113             using (var ftpClient = new FtpClient(this.IpAddr, this.UserName, this.Password, this.Port))
114             {
115               ftpClient.Connect();
116               ftpClient.SetWorkingDirectory(this.RelatePath);
117               flag = ftpClient.DirectoryExists(dir);
118               if (!flag)
119               {
120                     flag = ftpClient.CreateDirectory(dir);
121               }
122             }
123             return flag;
124
125
126         }
127
128         /// <summary>
129         /// 下载ftp
130         /// </summary>
131         /// <param name="localAddress"></param>
132         /// <param name="remoteAddress"></param>
133         /// <returns></returns>
134         public bool DownloadFile(string localAddress, string remoteAddress)
135         {
136             using (var ftpClient = new FtpClient(this.IpAddr, this.UserName, this.Password, this.Port))
137             {
138               ftpClient.SetWorkingDirectory("/");
139               ftpClient.Connect();
140               if (ftpClient.DownloadFile(localAddress, remoteAddress) == FtpStatus.Success)
141               {
142                     return true;
143               }
144               return false;
145             }
146         }
147
148         #endregion
149   }
150 }每一个FTP文件或文件夹,由一个自定义用户控件【PictureBox+Label+ContextMenu】表示,这样便于处理与显示:
1 using DemoFtp.Properties;
2 using FluentFTP;
3 using System;
4 using System.Collections.Generic;
5 using System.ComponentModel;
6 using System.Data;
7 using System.Drawing;
8 using System.IO;
9 using System.Linq;
10 using System.Text;
11 using System.Threading.Tasks;
12 using System.Windows.Forms;
13
14 namespace DemoFtp
15 {
16   public partial class FtpElementControl : UserControl
17   {
18         public Action<FtpListItem> SubFolderClick;
19
20         public Action<FtpListItem> DownLoadClick;
21
22         private FtpListItem ftpListItem;
23
24         public FtpElementControl(FtpListItem ftpListItem)
25         {
26             InitializeComponent();
27             this.ftpListItem = ftpListItem;
28         }
29
30         public FtpElementControl()
31         {
32             InitializeComponent();
33         }
34
35         public void InitControl()
36         {
37             if (ftpListItem.Type == FtpObjectType.Directory)
38             {
39               this.pbIcon.Image = Resources.folder.ToBitmap();
40             }
41             else if (ftpListItem.Type == FtpObjectType.File)
42             {
43               var name = ftpListItem.Name;
44               var ext = Path.GetExtension(name).ToLower().Substring(1);
45               if (ext == "png" || ext == "jpeg" || ext == "jpg" || ext == "bmp" || ext == "gif")
46               {
47                     this.pbIcon.Image = Resources.pictures.ToBitmap();
48               }
49               else if (ext == "doc" || ext == "docx")
50               {
51                     this.pbIcon.Image = Resources.doc.ToBitmap();
52               }
53               else if (ext == "exe")
54               {
55                     this.pbIcon.Image = Resources.setup.ToBitmap();
56               }
57               else
58               {
59                     this.pbIcon.Image = Resources.file;
60               }
61             }
62             else
63             {
64               this.pbIcon.Image = Resources.file;
65             }
66             this.lblName.Text = ftpListItem.Name;
67         }
68
69         private void FtpElementControl_Load(object sender, EventArgs e)
70         {
71            
72         }
73
74         /// <summary>
75         /// 子菜单下载功能
76         /// </summary>
77         /// <param name="sender"></param>
78         /// <param name="e"></param>
79         private void menu_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
80         {
81             this.DownLoadClick?.Invoke(ftpListItem);
82         }
83
84         /// <summary>
85         /// 双击打开
86         /// </summary>
87         /// <param name="sender"></param>
88         /// <param name="e"></param>
89         private void pbIcon_DoubleClick(object sender, EventArgs e)
90         {
91             this.SubFolderClick?.Invoke(ftpListItem);
92         }
93   }
94 }主页面由一系列用户操作框和按钮组成,完成对FTP的基本操作,如下所示:
1 using FluentFTP;
2 using System;
3 using System.Collections.Generic;
4 using System.ComponentModel;
5 using System.Data;
6 using System.Drawing;
7 using System.IO;
8 using System.Linq;
9 using System.Text;
10 using System.Threading.Tasks;
11 using System.Windows.Forms;
12
13 namespace DemoFtp
14 {
15   public partial class MainForm : Form
16   {
17         private FtpHelper ftpHelper;
18
19         public MainForm()
20         {
21             InitializeComponent();
22         }
23
24         private void btnLogin_Click(object sender, EventArgs e)
25         {
26             var url = txtFtpUrl.Text;
27             var userName = txtUserName.Text;
28             var password = txtPassword.Text;
29             var port = txtPort.Text;
30             if (this.lblRelatePath.Text != "/")
31             {
32               this.lblRelatePath.Text = "/";
33             }
34             var relatePath = this.lblRelatePath.Text;
35             if (string.IsNullOrEmpty(url) || string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(password) || string.IsNullOrEmpty(port))
36             {
37               MessageBox.Show("路径和账号密码不可为空");
38               return;
39             }
40             if (ftpHelper == null)
41             {
42               ftpHelper = new FtpHelper(url, int.Parse(port), userName, password, relatePath);
43
44             }
45             ListDir();
46         }
47
48         public void SubFolder(FtpListItem ftpListItem)
49         {
50             if (ftpListItem.Type == FtpObjectType.Directory)
51             {
52               var fullName = ftpListItem.FullName;
53               ftpHelper.RelatePath = fullName;
54               ListDir();
55               this.lblRelatePath.Text = fullName;
56             }
57         }
58
59
60         private void Download(FtpListItem ftpListItem) {
61             var fullName=ftpListItem.FullName;
62             var fileName = Path.GetFileName(fullName);
63             SaveFileDialog sfd = new SaveFileDialog();
64             sfd.FileName = fileName;
65             sfd.Title = "不载";
66             sfd.Filter = "所有文档|*.*";
67             if (DialogResult.OK == sfd.ShowDialog()) {
68               ftpHelper.DownloadFile(sfd.FileName, fullName);
69             }
70         }
71
72         private void ListDir()
73         {
74             this.ftpContainer.Controls.Clear();
75             var ftpListItems = this.ftpHelper.ListDir();
76             if (ftpListItems != null && ftpListItems.Length > 0)
77             {
78               foreach (var ftpListItem in ftpListItems)
79               {
80                     FtpElementControl ftpControl = new FtpElementControl(ftpListItem);
81                     ftpControl.InitControl();
82                     ftpControl.DownLoadClick += Download;
83                     ftpControl.SubFolderClick += SubFolder;
84                     this.ftpContainer.Controls.Add(ftpControl);
85               }
86             }
87         }
88
89         private void btnUpload_Click(object sender, EventArgs e)
90         {
91             OpenFileDialog ofd = new OpenFileDialog();
92             ofd.Filter = "所有文件|*.*";
93             ofd.Title = "请选择需要上传的文件";
94             if (DialogResult.OK == ofd.ShowDialog()) {
95               var localFile=ofd.FileName;
96               ftpHelper.UpLoad(this.lblRelatePath.Text, localFile, out bool isOk);
97               if (isOk) {
98                     ListDir();
99               }
100             }
101         }
102
103         private void pbReturn_Click(object sender, EventArgs e)
104         {
105             var relativePath=this.lblRelatePath.Text;
106             if (relativePath == "/") {
107               return;
108             }
109             relativePath = relativePath.Substring(0, relativePath.LastIndexOf("/")+1);
110             ftpHelper.RelatePath=relativePath;
111             ListDir();
112             this.lblRelatePath.Text = relativePath;
113         }
114   }
115 }以上就是基于FluentFTP实现FTP上传下载的全部内容,旨在抛砖引玉,共同学习,一起进步。

来源:https://www.cnblogs.com/hsiang/archive/2023/02/21/17139285.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: C# 利用FluentFTP实现FTP上传下载功能