最近工作中用到了 FTP 相关的操作,所以借此机会了解了下具体内容。

FTP基础

关于 FTP 基础推荐阅读《使用 Socket 通信实现 FTP 客户端程序》,其中需要特别注意的是主动模式和被动模式,这一部分在日常使用中经常被忽略,但生产环境中可能会出问题,关键在于防火墙对端口的控制。

  • 主动模式:服务器采用 21 和 20 端口,客户端采用大于 1024 的随机端口,连接指令和文件传输指令由服务端发送。
  • 被动模式:服务端采用 21 和大于 1024 的随机端口,客户端采用大于 1024 的随机端口,连接指令由客户端发送。

程序操作 FTP 过程在上面推荐的文章中有所提及,大家可以看到过程还是比较复杂的,不过好在有 apache 的 commons-net 给我们提供了相关的工具类可以使用,本文使用的是 3.6 版本。以下通过代码进行说明,此代码仅演示功能,很多地方并不完善,如果用作生产请自行修改。

Java FTP 上传

  1. /**
  2. * FTP发送至目标服务器
  3. * @apiNote 依赖apache commons-net 包
  4. * @param server
  5. */
  6. public static void sendToServerByFTP(String server, int port, String username, String password,
  7. String encoding, String fileLocalPath, String fileRemotePath, String fileRemoteName) throws IOException {
  8. // 获取 FTPClient
  9. FTPClient ftpClient = new FTPClient();
  10. ftpClient.connect(server, port);
  11. ftpClient.login(username, password);
  12. int replyCode = ftpClient.getReplyCode();
  13. if (!FTPReply.isPositiveCompletion(replyCode)) {
  14. System.out.println("connected failed");
  15. }
  16. // 设置编码,当文件中存在中文且上传后文件乱码时可使用此配置项
  17. //ftpClient.setControlEncoding(encoding);
  18. // 切换为本地被动模式,可以解决FTP上传后文件为空的问题,但需要服务器将FTP服务添加至防火墙白名单
  19. //ftpClient.enterLocalPassiveMode();
  20. // 切换到指定目录
  21. ftpClient.changeWorkingDirectory(fileRemotePath);
  22. // 获取文件并上传
  23. File file = new File(fileLocalPath);
  24. InputStream inputStream = new FileInputStream(file);
  25. //文件名为中文名且上传后出现乱码时启用此项
  26. //String fileName = new String(fileRemoteName.getBytes(encoding), "ISO8859-1");
  27. boolean flag = ftpClient.storeFile(fileRemoteName, inputStream);
  28. // 关闭已占用资源
  29. inputStream.close();
  30. ftpClient.logout();
  31. }

FTP 下载

FTP 下载和上传基本步骤类似,依赖的方法由 storeFile 变为 retrieveFile

  1. public void downloadFile(String server, int port, String username, String password,
  2. String serverPath, String localPath, String fileName) throws IOException {
  3. // 登录
  4. FTPClient ftpClient = new FTPClient();
  5. ftpClient.connect(server, port);
  6. ftpClient.login(username, password);
  7. // 验证登录情况
  8. int replyCode = ftpClient.getReplyCode();
  9. if (!FTPReply.isPositiveCompletion(replyCode)) {
  10. throw new RuntimeException("登录FTP服务器失败,错误代码:" + replyCode);
  11. }
  12. // 切换服务器至目标目录
  13. ftpClient.changeWorkingDirectory(serverPath);
  14. // 下载文件
  15. File file = new File(localPath);
  16. FileOutputStream fileOutputStream = new FileOutputStream(file);
  17. ftpClient.retrieveFile(fileName, fileOutputStream);
  18. // 关闭资源占用
  19. fileOutputStream.close();
  20. ftpClient.logout();
  21. }

FTP 删除

  1. public void deleteFile(String server, int port, String username, String password,
  2. String serverPath, String fileName) throws IOException {
  3. // 登录
  4. FTPClient ftpClient = new FTPClient();
  5. ftpClient.connect(server, port);
  6. ftpClient.login(username, password);
  7. // 验证登录情况
  8. int replyCode = ftpClient.getReplyCode();
  9. if (!FTPReply.isPositiveCompletion(replyCode)) {
  10. throw new RuntimeException("登录FTP服务器失败,错误代码:" + replyCode);
  11. }
  12. ftpClient.changeWorkingDirectory(serverPath);
  13. ftpClient.deleteFile(fileName);
  14. }

Java FTP 基本操作的更多相关文章

  1. 用edtftpj实现Java FTP客户端工具

    edtftpj是一个java FTP工具包,使用非常方便,感觉比Apache的好用,但Apache更灵活.edtftpj有多种版本,分别是java..net和js版本.对于Java版的有一个免费版本. ...

  2. 关于Java FTP SFTP的相关实际问题

    第一个: java ftp使用的是Apache common-net,但是FTP服务侧提供的FTP服务器只支持SFTP,结果报 java.net.ConnectException: Connectio ...

  3. 学习java窗口基本操作时无聊写的

    学习java窗口基本操作时无聊写的 就当记录 代码如下: package day08; import java.awt.BorderLayout;import java.awt.Color;impor ...

  4. Java链表基本操作和Java.util.ArrayList

    Java链表基本操作和Java.util.ArrayList 今天做了一道<剑指offer>上的一道编程题“从尾到头打印链表”,具体要求如下:输入一个链表,按链表值从尾到头的顺序返回一个A ...

  5. Java ftp上传文件方法效率对比

    Java ftp上传文件方法效率对比 一.功能简介: txt文件采用ftp方式从windows传输到Linux系统: 二.ftp实现方法 (1)方法一:采用二进制流传输,设置缓冲区,速度快,50M的t ...

  6. (转)【Java FTP及FTP服务器搭建】

    转至 http://blog.csdn.net/studyvcmfc/article/details/8147052 目录(?)[+] -[Java FTP及FTP服务器搭建] 一:本文采用apach ...

  7. Java FTP客户端开源类库 edtFTPj

    edtFTPj/Free是免费的流行的Java FTP库,全球公司依靠edtFTPj /Free 为它们的Java应用程序添加FTP客户端功能. (收费的支持SFTP.FTPS的edtFTPj/PRO ...

  8. docker 部署vsftpd服务、验证及java ftp操作工具类

    docker部署vsftpd服务 新建ftp文件存储目录/home/ftp cd /home mkdir ftp 创建一个组,用于存放ftp用户 groupadd ftpgroups 创建ftp用户, ...

  9. java ftp

    FTPUtil import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import jav ...

随机推荐

  1. 文件上传api——MultipartFile

    MultipartFile 方法总结  byte[] getBytes() 返回文件的内容作为一个字节数组.  String getContentType() 返回文件的内容类型.  InputStr ...

  2. Qt 学习: 视图选择 (QItemSelectionModel)

    博主QQ:1356438802 选择是视图中经常使用的一个操作.在列表.树或者表格中,通过鼠标点击能够选中某一项,被选中项会变成高亮或者反色.在 Qt 中,选择也是使用了一种模型.在 model/vi ...

  3. php课程 6-22 字符串格式化函数有哪些(精问)

    php课程 6-22 字符串格式化函数有哪些(精问) 一.总结 一句话总结: 1.猜测一下$_GET()怎么来的? 函数赋值给变量的操作:$_YZM=get();   这样就可以很好的解释哪些全局变量 ...

  4. html5常用标签table表格布局

    html5常用标签table表格布局 一.总结 一句话总结: 二.html5常用标签table表格布局 用表格显示信息调理清楚,使浏览者一目了然.表格在网页中还有协助布局的作用,可以把文字.图像等组织 ...

  5. 二维高斯滤波器(gauss filter)的实现

    我们以一个二维矩阵表示二元高斯滤波器,显然此二维矩阵的具体形式仅于其形状(shape)有关: def gauss_filter(kernel_shape): 为实现二维高斯滤波器,需要首先定义二元高斯 ...

  6. Newtonsoft.Json 序列化反序列化

    public class People { public string name { get; set; } public string age { get; set; } public string ...

  7. 【codeforces 768C】Jon Snow and his Favourite Number

    [题目链接]:http://codeforces.com/contest/768/problem/C [题意] 给你n个数字; 让你每次把这n个数字排序; 然后对奇数位的数字进行异或操作,然后对新生成 ...

  8. try catch finally中的return

    try catch 中finally语句总是可以执行的,不管try中是否含有return语句 public class TestReturn { public static void main(Str ...

  9. Web开发四大作用域(转)

    Web开发中的四个域对象(范围由小到大): page(jsp有效)  request(一次请求) session(一次会话) application(当前web应用) page域指的是pageCont ...

  10. Spring MVC出现POST 400 Bad Request &405 Request method 'GET' not supported

    首先描述一下出现错误的情景: 我刚学springmvc,想做一个登录界面的东西.然后试着写了一个controller如下: @RequestMapping(value = "/login&q ...