Java FTP 基本操作
最近工作中用到了 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 基本操作的更多相关文章
- 用edtftpj实现Java FTP客户端工具
edtftpj是一个java FTP工具包,使用非常方便,感觉比Apache的好用,但Apache更灵活.edtftpj有多种版本,分别是java..net和js版本.对于Java版的有一个免费版本. ...
- 关于Java FTP SFTP的相关实际问题
第一个: java ftp使用的是Apache common-net,但是FTP服务侧提供的FTP服务器只支持SFTP,结果报 java.net.ConnectException: Connectio ...
- 学习java窗口基本操作时无聊写的
学习java窗口基本操作时无聊写的 就当记录 代码如下: package day08; import java.awt.BorderLayout;import java.awt.Color;impor ...
- Java链表基本操作和Java.util.ArrayList
Java链表基本操作和Java.util.ArrayList 今天做了一道<剑指offer>上的一道编程题“从尾到头打印链表”,具体要求如下:输入一个链表,按链表值从尾到头的顺序返回一个A ...
- Java ftp上传文件方法效率对比
Java ftp上传文件方法效率对比 一.功能简介: txt文件采用ftp方式从windows传输到Linux系统: 二.ftp实现方法 (1)方法一:采用二进制流传输,设置缓冲区,速度快,50M的t ...
- (转)【Java FTP及FTP服务器搭建】
转至 http://blog.csdn.net/studyvcmfc/article/details/8147052 目录(?)[+] -[Java FTP及FTP服务器搭建] 一:本文采用apach ...
- Java FTP客户端开源类库 edtFTPj
edtFTPj/Free是免费的流行的Java FTP库,全球公司依靠edtFTPj /Free 为它们的Java应用程序添加FTP客户端功能. (收费的支持SFTP.FTPS的edtFTPj/PRO ...
- docker 部署vsftpd服务、验证及java ftp操作工具类
docker部署vsftpd服务 新建ftp文件存储目录/home/ftp cd /home mkdir ftp 创建一个组,用于存放ftp用户 groupadd ftpgroups 创建ftp用户, ...
- java ftp
FTPUtil import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import jav ...
随机推荐
- Android 调整透明度的图片查看器
本文以实例讲解了基于Android的可以调整透明度的图片查看器实现方法,具体如下: main.xml部分代码如下: <?xml version="1.0" encoding ...
- lower_case_table_names(大小写敏感)
1 简介 在MySQL中,数据库对应数据目录中的目录.数据库中的每个表至少对应数据库目录中的一个文件(也可能是多个,取决于存储引擎).因此,所使用操作系统的大小写敏感性决定了数据库名和表名的大小 ...
- Delphi程序的自我修改
前言: 对于Delphi在编译时对代码所做的工作,大部分使用Object Pascal之类的高级语言的程序员并不是很熟悉.如果你对汇编程序以及EXE文件格式有一点基本认识,那么源代码里包含的注 ...
- Architectures for concurrent graphics processing operations
BACKGROUND 1. Field The present invention generally relates to rendering two-dimension representatio ...
- ios 即时通讯开源IM,LeanCloud、融云、环信
环信官网链接: http://easemob.com/docs/ios/
- UIApplicationsharedApplication的详解
iPhone应用程序是由主函数main启动,它负责调用UIApplicationMain函数,该函数的形式如下所示: int UIApplicationMain ( int argc, char *a ...
- 一起学Python:元组
元组 Python的元组与列表类似,不同之处在于元组的元素不能修改.元组使用小括号,列表使用方括号. >>> aTuple = ('et',77,99.9)>>> ...
- kindeditor 4 指定生成文件的时间日期/动态获取My97的时间
最近后台要求要指定上传附件的时间日期,编辑器是kindeditor,仔细研究后发现可以借助clickToolbar事件,传递时间到后台,但是中途发现传递的时间总是初始化my97的时间,改变后的时间只有 ...
- 微信小程序的轮播图swiper问题
微信小程序的轮播图swiper,调用后,怎样覆盖系统的 点,达到自己想要的效果 不多说,先上一图望大家多给意见: 这个是效果图: 微信小程序效果图就成这样子: <view class=" ...
- 采用navicat导出表结构及数据insert声明
旧navicat有一段时间,查找navicat真的很方便,它可以支持各种数据库的. 他一直认为无处不在sql文件比较麻烦,每个表会生成一个sql档,不方便开展进口业务.今天,它已突然发现了一个批次sq ...