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;
}
}
}
以上就是基于FluentFTP实现FTP上传下载的全部内容,旨在抛砖引玉,共同学习,一起进步。