前期准备
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;
}
测试
虽然为了简化代码去掉了很多异常情况处理操作,但是在正常情况下还是可以完成上述操作的。有那么多功能总要测试一下,可以看到我们测试的步骤为:
- 初始化FtpClient
- 下载Ftp上的所有文件到本地
- 删除Ftp上的"1.jpg"
- 将刚下载的"1.jpg"图片上传到Ftp服务器
- 退出登陆、关闭连接
public static void main(String[] arg) throws Exception {
boolean is_success = false;
//初始化FtpClient
is_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