热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

.NETCore下好用的FTP框架FluentFTP

项目中经常涉及到将文件批量上传到其它空间或服务器,这个时候我们有可能需要用到FTP协议进行传输,所以这里我推荐使用FluentFTP,一款很好用的FTP传输框架。githu

  项目中经常涉及到将文件批量上传到其它空间或服务器,这个时候我们有可能需要用到FTP协议进行传输,所以这里我推荐使用FluentFTP,一款很好用的FTP传输框架。

  github地址:https://github.com/robinrodricks/FluentFTP

  Nuget安装一下:

PM> Install-Package FluentFTP

  首先第一步,new一个Client:

1 /*
2 第一个参数是FTP地址,注意要加协议名
3 第二个参数是端口,默认21
4 第三个参数是FTP用户名
5 第四个参数是FTP密码
6 正常情况下配置三个属性即可,大家按需选择:
7 EncryptionMode是指定加密方式,这里我选择None不加密,
8 DataConnectionType是连接方式,一般都是选PASV被动模式或PORT主动模式,根据FTPServer情况修改
9 Encoding是指定编码
10 */
11 var ftpClient = new FtpClient($"ftp://{host}", port, userName, passWord)
12 {
13 EncryptiOnMode= FtpEncryptionMode.None,
14 DataCOnnectionType= FtpDataConnectionType.PASV,
15 Encoding = Encoding.UTF8
16 };

   接下来第二步,登录FTP:

1 //IsConnected是判断client是否与远程服务建立了连接
2 if (!ftpClient.IsConnected)
3 {
4 //发起连接登录
5 await ftpClient.ConnectAsync();
6 //启用UTF8传输
7 var result = ftpClient.Execute("OPTS UTF8 ON");
8 if (!result.Code.Equals("200") && !result.Code.Equals("202"))
9 ftpClient.Encoding = Encoding.GetEncoding("ISO-8859-1");
10 }

   这里有一个比较坑的地方,特别是不了解FTP的伙伴,甚至会纠结半天,那就是文件如果是中文文件名,上传后文件名会变成乱码。原因是因为有一些FTPServer默认是不开启UTF8编码传输,甚至不支持UTF8编码传输,这个时候需要我们手动开启一下,FTP命令是OPTS UTF8 ON

ftpClient.Execute("OPTS UTF8 ON");

  这个时候FTPServer会返回一个状态码,200表示开启成功;202是always enable,表示FTPServer会一直处于开启UTF-8编码的状态,不需要手动开启。

  但除此之外,还有刚才提到的,FTPServer本身不支持UTF8编码的传输,这个时候我们需要将之前的Encoding设置为ISO-8859-1即可:

ftpClient.Encoding = Encoding.GetEncoding("ISO-8859-1");

   第三步,上传文件:

1 ///


2 /// 上传单个文件
3 ///

4 ///

文件源路径
5 ///

上传到指定的ftp文件夹路径
6 public async void UploadFile(string sourcePath, string destPath)
7 {
8 if (!File.Exists(sourcePath))
9 return;
10 var fileInfo = new FileInfo(sourcePath);
11 await ftpClient.UploadFileAsync(sourcePath, $"{destPath}/{fileInfo.Name}", createRemoteDir: true);
12 }

   如果想批量上传文件,则使用ftpClient.UploadDirectoryAsync(),可以直接上传整个文件夹。

        这里有个比较坑的地方是,如果FTPServer目录下的文件特别多(注意:不是你上传文件的数量),上传所需的时间会特别长。在我查看了FTPServer日志后发现,在使用UploadDirectoryAsync()的时候,FluentFTP会先去获取所有文件和文件夹的列表,在获取完所有列表信息后,才开始上传操作,非常浪费时间。在尝试解决无果后,我去github上找了一下,作者的回复是:

  Currently we support 2 modes, update and mirror. In any mode, the remote directory is fully listed, then compared, then the actually upload begins. This is done in order to skip files that are already uploaded. We can support a third mode, maybe like BlindTransfer which will not list the remote directory.

  google翻译:目前,我们支持2种模式:更新和镜像。 在任何模式下,远程目录都会完整列出,然后进行比较,然后开始实际的上载。 这样做是为了跳过已经上传的文件。 我们可以支持第三种模式,例如BlindTransfer,它不会列出远程目录。

  但在目前最新版本33.0.3版本下,仍旧只支持Mirror和Update两种模式。

  Issues:https://github.com/robinrodricks/FluentFTP/issues/616

  所以,如果需要批量上传,可以在单文件上传的基础上自己再做一层封装,至于其它的下载、删除、查看等功能,暂未发现其它的坑,环境.net core 3.1。

  这里举几个常用的方法,其余的不在这里赘述,大家看文档和框架的注释就行:

//下载文件
ftpClient.DownloadFileAsync();
//下载文件夹
ftpClient.DownloadDirectoryAsync();
//删除文件
ftpClient.DeleteFileAsync();
//删除文件夹
ftpClient.DeleteDirectoryAsync();
//判断文件是否存在
ftpClient.FileExistsAsync();
//判断文件夹是否存在
ftpClient.DirectoryExistsAsync();
//获取列表的详细信息
ftpClient.GetListingAsync();

   最后,记住登出、释放资源:

1 if (ftpClient.IsConnected)
2 {
3 //关闭
4 await ftpClient.DisconnectAsync();
5 ftpClient.Dispose();
6 }

         FluentFTP除了上述的坑以外,功能还是非常齐全、强大的,提供了各种各样的方法和配置,建议大家使用。

   author:https://www.cnblogs.com/abnerwong/

一个只会写"Hello World"的小小程序员



推荐阅读
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 优化联通光猫DNS服务器设置
    本文详细介绍了如何为联通光猫配置DNS服务器地址,以提高网络解析效率和访问体验。通过智能线路解析功能,域名解析可以根据访问者的IP来源和类型进行差异化处理,从而实现更优的网络性能。 ... [详细]
  • 本文探讨了如何在 PHP 的 Eloquent ORM 中实现数据表之间的关联查询,并通过具体示例详细解释了如何将关联数据嵌入到查询结果中。这不仅提高了数据查询的效率,还简化了代码逻辑。 ... [详细]
  • 创建项目:Visual Studio Online 入门指南
    本文介绍如何使用微软的 Visual Studio Online(VSO)创建和管理开发项目。作为一款基于云计算的开发平台,VSO 提供了丰富的工具和服务,简化了项目的配置和部署流程。 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • 为了解决不同服务器间共享图片的需求,我们最初考虑建立一个FTP图片服务器。然而,考虑到项目是一个简单的CMS系统,为了简化流程,团队决定探索七牛云存储的解决方案。本文将详细介绍使用七牛云存储的过程和心得。 ... [详细]
  • 本文详细介绍了 phpMyAdmin 的安装与配置方法,适用于多个版本的 phpMyAdmin。通过本教程,您将掌握从下载到部署的完整流程,并了解如何根据不同的环境进行必要的配置调整。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 邮件(带附件,模拟文件上传,跨服务器)发送核心代码1.测试邮件发送附件接口***测试邮件发送附件*@parammultipartFile*@return*@RequestMappi ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • 本文介绍如何在Linux服务器之间使用SCP命令进行文件传输。SCP(Secure Copy Protocol)是一种基于SSH的安全文件传输协议,支持从远程机器复制文件到本地服务器或反之。示例包括从192.168.45.147复制tomcat目录到本地/home路径。 ... [详细]
  • 在Python开发过程中,随着项目数量的增加,不同项目依赖于不同版本的库,容易引发依赖冲突。为了避免这些问题,并保持开发环境的整洁,可以使用Virtualenv和Virtualenvwrapper来创建和管理多个隔离的Python虚拟环境。 ... [详细]
  • PostgreSQL 10 离线安装指南
    本文详细介绍了如何在无法联网的服务器上进行 PostgreSQL 10 的离线安装,并涵盖了从下载安装包到配置远程访问的完整步骤。 ... [详细]
author-avatar
神秘的绝代双角
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有