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

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

admin
2023年10月9日 9:54 本文热度 1069
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文件的检索,上传,下载等功能,如下所示:

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;

        }

    }

}


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