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

FTP基础

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

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

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

Java FTP 上传

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

FTP 下载

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

public void downloadFile(String server, int port, String username, String password,
String serverPath, String localPath, String fileName) throws IOException {
// 登录
FTPClient ftpClient = new FTPClient();
ftpClient.connect(server, port);
ftpClient.login(username, password); // 验证登录情况
int replyCode = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(replyCode)) {
throw new RuntimeException("登录FTP服务器失败,错误代码:" + replyCode);
} // 切换服务器至目标目录
ftpClient.changeWorkingDirectory(serverPath); // 下载文件
File file = new File(localPath);
FileOutputStream fileOutputStream = new FileOutputStream(file);
ftpClient.retrieveFile(fileName, fileOutputStream); // 关闭资源占用
fileOutputStream.close();
ftpClient.logout();
}

FTP 删除

public void deleteFile(String server, int port, String username, String password,
String serverPath, String fileName) throws IOException {
// 登录
FTPClient ftpClient = new FTPClient();
ftpClient.connect(server, port);
ftpClient.login(username, password); // 验证登录情况
int replyCode = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(replyCode)) {
throw new RuntimeException("登录FTP服务器失败,错误代码:" + replyCode);
} ftpClient.changeWorkingDirectory(serverPath); ftpClient.deleteFile(fileName);
}

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. 配置Apache支持PHP5

    环境:window 7.Apache/2.2.19 (Win32) PHP/5.2.9-1 1.配置server名称 将里面的 #ServerName localhost:80 凝视去掉就可以. 又一 ...

  2. [Angular] Subscribing to the valueChanges Observable

    For example we have built a form: form = this.fb.group({ store: this.fb.group({ branch: '', code: '' ...

  3. 本人录制的视频资源(C/C++、Go、Qt、Linux等)

    持续更新-- 编程语言 C语言开发实战:http://pan.baidu.com/s/1qXAP4x2 C语言贪吃蛇:https://pan.baidu.com/s/1pLRZIuJ C提高:http ...

  4. ios9 xcode7以后编译需要进行的几项设置

    http://blog.csdn.net/hero82748274/article/details/48629461 1.库后缀变了:.dylib->tbd libsqlite3.0.dylib ...

  5. 使用jsp,tomcat实现用户登录注册留言的代码

    以下jsp中,未使用样式表对网页进行排版和表单的验证(每个jsp的表单填写的时候应该进行空值与空格的验证,防止提交时出错) 所有错误,链接到error.jsp <%@ page language ...

  6. 解决Request method 'GET' not supported问题

    博主最近遇到了这个问题,解决情况如下 第一种情况:前台页面的表单在一些情况下没有指定POST方法: Ajax没有指定POST方法: 后台方法在一定情况下需要指定POST方法: 第二种情况:前端参数类型 ...

  7. ts demuxer的加入记录

    文件夹 1 初衷 2 ts demux的功能介绍 1 初衷 之前打算给dtplayer加入一些亮点功能,最初的想法是:bt下载播放 + hls支持 bt下载因为以来libtorrent库,尽管搞懂了怎 ...

  8. combobox添加选项

    如果不需要绑定字段,只需要显示列表 cmb_Type.Items.AddRange(new object[] {"姓名","年龄","性别" ...

  9. Winform中GridView分组排序实现功能

    由于客户最近要扩充公司的业务,之前基于Winform+web开发混合式的系统已经不能满足他们的需求,需要从新对系统进行分区处理. 考虑到系统模块里面用到的GridView视图比较多,我就结合了DevE ...

  10. 【71.76%】【codeforces 732A】Buy a Shovel

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...