LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

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

admin
2023年10月9日 9:54 本文热度 523
FTP作为日常工作学习中,非常重要的一个文件传输存储空间,想必大家都非常的熟悉了,那么如何快速的实现文件的上传下载功能呢,本文以一个简单的小例子,简述如何通过FluentFTP实现文件的上传和下载功能

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
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】表示,这样便于处理与显示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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的基本操作,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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;
        }
    }
}



该文章在 2023/10/9 9:54:29 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved