前期准备

1. 搭建Ftp服务器

为了方便本地测试,一开始可以先在本地搭建Ftp服务器。搭建Ftp服务器的教程有很多,这里就不多讲了,下面是我用到的教程你们可以参考一下。
百度经验:Win10如何搭建FTP服务器

要注意几点:

  • 权限分配的时候要允许“读和写”,这样才可以确保上传和下载的顺利进行。
  • 不能用匿名登陆,不然会测试的时候FTPClient会连接不上。
  • 搭建完后可以自己先测试一下,用另一台电脑连接进行上传、下载和删除等操作。

2. 导入相关的包

实现这些功能要用到一个FTPClient类,需要从外部导入commons-net-3.6包。如果是不是Maven项目,只能从网络下载包。下载地址如下:
官网下载地址

如果是Maven项目,只需要添加相关依赖:

<dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.6</version>
</dependency>

ps:如果需要其他包的时候,可以到这个网站上找相关依赖怎么写。
https://mvnrepository.com/

正式开码

1. Ftp服务器的连接

连接ftp服务器之前需要用到以下参数,可以直接写死,有经常更改的需求的话可以选择从配置文件中读取。

ps:相关参数都填自己的,我这里是为了给个例子乱填的。

private static FTPClient ftpClient;          //创建对象
private static String ip = "192.168.0.1";    //ftp地址
private static Integer port = 21;            //ftp默认端口号是21
private static String userName = "Veggie";   //用户名
private static String passWord = "root";  //密码

接下来就是执行初始化操作,包括对量初始化、连接和登陆。
无法连接失败可能的原因:

  • 不在同一个局域网中,要在同一个局域网中才能连接。
  • 显示连接已经被重置,可以选择用IIS管理器重启Ftp服务器。再不行的话,可以先把创建的Ftp删除再重新创建。
public static boolean initFtpClient() throws Exception {boolean is_success = false;int reply;ftpClient = new FTPClient();try {ftpClient.connect(ip, port);         //连接Ftp服务器ftpClient.login(userName, passWord);  //登陆Ftp服务器ftpClient.setControlEncoding("utf-8");//设置编码类型reply = ftpClient.getReplyCode();     //获取返回码,用于判断是否连接成功if (!FTPReply.isPositiveCompletion(reply)) {throw new Exception("服务器连接失败");} else {ftpClient.enterLocalPassiveMode();  //设置被动模式ftpClient.setControlEncoding("GBK");//设置字符模式,解决中文乱码问题is_success = true;}} catch (Exception e) {e.printStackTrace();} return is_success;}

虽然之前试过操作完成之后没有关闭连接,但是关闭连接应该还是有一定意义的,还是调用一下吧。

public static void dropFtpClient() {try {ftpClient.logout();     //退出登陆if (ftpClient.isConnected()) {//检测是否连接Ftp服务器ftpClient.disconnect(); //关闭连接}} catch (IOException e) {e.printStackTrace();}
}

2. 上传操作

如果上传有问题,有可能是没有开启给连接者分配“写”的权限

/*** 上传文件** @param pathname       ftp服务保存地址* @param originfilename 待上传文件的名称(绝对地址) ** @return*/
public static boolean uploadFile(String pathname, String originfilename) {boolean is_success = false;InputStream inputStream = null;try {File localFile = new File(originfilename);inputStream = new FileInputStream(localFile);ftpClient.setFileType(FTP.BINARY_FILE_TYPE);ftpClient.changeWorkingDirectory(pathname); //跳转到指定的Ftp文件目录(相对路径)is_success = ftpClient.storeFile(localFile.getName(), inputStream);//上传文件inputStream.close();} catch (Exception e) {e.printStackTrace();}return is_success;
}

3. 下载操作

这个下载操作是把该路径下所有的文件都下载来,也可以根据自己的需求改写为下载里面某个指定的文件。
相应的,如果在参数传递没有问题的情况下出现下载是失败的情况,就要去看看有没有“读”的权限。

/** 下载文件** @param pathName  ftp服务器文件目录* @param localPath 下载后的文件路径 ** @return*/
public static boolean downloadFile(String pathName, String localPath) {boolean is_success = false;OutputStream os = null;try {ftpClient.changeWorkingDirectory(pathName);//跳转到指定的Ftp文件目录FTPFile[] ftpFiles = ftpClient.listFiles();//获取目录下所有的文件和文件夹//遍历目录下所有的文件for (FTPFile file : ftpFiles) {if (file.isFile()) {File localFile = new File(localPath + "/" + file.getName());os = new FileOutputStream(localFile);ftpClient.retrieveFile(file.getName(), os);//下载文件到本地os.close();} else if (file.isDirectory()) {downloadFile(pathName + file.getName() + "/", localPath);}}is_success = true;} catch (Exception e) {e.printStackTrace();}return is_success;
}

4. 删除操作

如果上面两个操作都没问题的话,一般删除也不会有问题。

/** 删除文件** @param pathName  ftp服务器文件目录* @param fileName  删除的文件名* @return*/
public static boolean deleteFile(String pathNmae, String fileName) {boolean is_success = false;try {ftpClient.changeWorkingDirectory(pathNmae);is_success = ftpClient.deleteFile(fileName);//删除文件} catch (Exception e) {e.printStackTrace();}return is_success;
}

测试

虽然为了简化代码去掉了很多异常情况处理操作,但是在正常情况下还是可以完成上述操作的。有那么多功能总要测试一下,可以看到我们测试的步骤为:

  1. 初始化FtpClient
  2. 下载Ftp上的所有文件到本地
  3. 删除Ftp上的"1.jpg"
  4. 将刚下载的"1.jpg"图片上传到Ftp服务器
  5. 退出登陆、关闭连接
public static void main(String[] arg) throws Exception {boolean is_success = false;//初始化FtpClientis_success = initFtpClient();System.out.println(is_success);//下载Ftp上的所有文件到本地is_success=downloadFile("/","D:\\test0");System.out.println(is_success);//删除Ftp上指定文件is_success = deleteFile("/", "1.jpg");System.out.println(is_success);//将本地文件上传到Ftp服务器is_success = uploadFile("/","D:\\test0\\1.jpg");System.out.println(is_success);//退出登陆、关闭连接dropFtpClient();
}

通过观察控制台返回的信息,看到在我的电脑上测试是没有问题,可以到文件夹看看是不是真的成功了。

//看了一下,确实是成功了的

参考资料

关于这个参考资料,我一直都觉得很坑爹,在网上找的资料百分之五六十里面的内容都是一样的,而且都标注着原创(说原创起码要有点自己的东西嘛)。有的还直接把人家的内容直接复制上去,也不标注出处,连格式都懒得该一下,我也是醉了,开始莫名反感这种行为。
https://blog.csdn.net/lht931942788/article/details/80278916

Java实现ftp的上传、下载和删除相关推荐

  1. [转]文件传输协议(FTP)操作(上传,下载,新建,删除,FTP间传送文件等)实现汇总1

    转自:http://blog.csdn.net/soarheaven/archive/2008/12/08/3474152.aspx 最近项目需要对FTP服务器进行操作,现把实现总结如下: 打算分2篇 ...

  2. Microsoft .NET Framework 2.0对文件传输协议(FTP)操作(上传,下载,新建,删除,FTP间传送文件等)实现汇总1...

    相关文章导航 Sql Server2005 Transact-SQL 新兵器学习总结之-总结 Flex,Fms3相关文章索引 FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统 ...

  3. Java通过FTP服务器上传下载文件的方法

    本文介绍了如何使用Apache Jakarta Commons Net(commons-net-3.3.jar)基于FileZilla Server服务器实现FTP服务器上文件的上传/下载/删除等操作 ...

  4. 【FTP】java实现FTP服务上传下载

    1.首先在pom文件中添加ftp相关依赖. <!--和FTP有关--><dependency><groupId>commons-net</groupId> ...

  5. java ftp 下载慢_Java实现ftp文件上传下载解决慢中文乱码多个文件下载等问题

    废话不多说了,直接给大家贴代码了,具体代码如下所示: //文件上传 public static boolean uploadToFTP(String url,int port,String usern ...

  6. Linux 终端访问 FTP 及 上传下载 文件

    今天同事问我一个问题,在Linux 下访问FTP,并将文件上传上去. 我之前一直是用WinSCP工具的. 先将文件从linux copy到windows下,然后在传到ftp上. google 一下. ...

  7. Linux 终端訪问 FTP 及 上传下载 文件

    今天同事问我一个问题,在Linux 下訪问FTP,并将文件上传上去. 我之前一直是用WinSCP工具的. 先将文件从linux copy到windows下,然后在传到ftp上. google 一下. ...

  8. ftp文件推送 linux_Linux 终端访问 FTP 及 上传下载 文件

    今天同事问我一个问题,在Linux 下访问FTP,并将文件上传上去. 我之前一直是用WinSCP工具的. 先将文件从linux copy到windows下,然后在传到ftp上.google 一下. 方 ...

  9. 关于FileZilla连接FTP站点上传下载文件

    关于FileZilla连接FTP站点上传下载文件 浏览器搜索FileZilla官网:https://www.filezilla.cn/download 根据自己操作系统安装 安装完成之后的启动界面是这 ...

  10. C++:FTP文件上传下载(附完整源码)

    C++:FTP文件上传下载 FTP文件下载 FTP文件上传 FTP文件下载 #include #include #include #pragma comment(lib, "WinInet. ...

最新文章

  1. Cache 工作原理,Cache 一致性,你想知道的都在这里
  2. flash写保护原理_STM32系统中的2种数据掉电保护方法!
  3. PC处理器装机中的认识 三
  4. npm出错的解决方案
  5. 【机器学习基础】机器学习模型什么时候需要做数据标准化?
  6. 解析JavaScript中的字符串类型与字符编码支持
  7. ios beta 下载_如何回滚到iOS 10(如果您使用的是iOS 11 Beta)
  8. Android 系统(78)--应用安装时间长
  9. Java学习-Overload和Override的区别
  10. 密钥库证书的SHA-1指纹
  11. Java进阶之路——从初级程序员到架构师,从小工到专家(转)
  12. 态密度(PDOS)曲线和声子色散曲线(PDC)之间的关系
  13. 苹果科学计算机使用方法,iPhone的计算器五大使用技巧
  14. 谷歌又放大招 Disco Diffusion!AI生成超高质量绘画!
  15. 万字长文 | 面向k8s编程,如何写一个Operator
  16. SAS硬盘和SATA硬盘傻傻分不清?不懂的看这里
  17. 开源许可协议 | GNU GPL
  18. history of program atan2(y,x)和pow(x,y)
  19. Splunk 会议回顾: 大数据的关键是机器学习
  20. 鸿蒙掉不掉凤羽符,《诛仙3》灌注符怎么得?装备各部件灌注符获取方式一览...

热门文章

  1. 验证异常处理调用顺序
  2. gossip 区块链_源代码: 一个最小化的区块链系统
  3. Windows进程与线程学习笔记(八)—— 线程切换与TSS/FS
  4. 006 Android之Activity
  5. 004 .NetReactor 3.6.0.0之另类脱壳法
  6. PE学习(十一)第十一章:动态加载技术
  7. B - Bone Collector (01背包)
  8. 3.5.5 CSMA/CD 协议
  9. 全文索引的使用(MySQL)
  10. Freemarker获取pojo属性