首先在linux系统种安装vsftpd,然后设置SSL加密,这些就不说了,主要说一下代码
package com.numberone.master.test.web;
import org.apache.commons.net.PrintCommandListener;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.commons.net.ftp.FTPSClient;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.PrintWriter;
import java.security.NoSuchAlgorithmException;
public class FtpsDemo {
/**
* 本地字符编码
*/
private static String LOCAL_CHARSET = "GBK";
// FTP协议文件名编码为iso-8859-1
private static String SERVER_CHARSET = "ISO-8859-1";
public static void main(String[] args) throws NoSuchAlgorithmException {
String path = "C:/loga/cftsl_202107.txt";
String fileName = "cftsl_202107.txt";
String protocol = "SSL";
File file = new File(path);
try {
FTPSClient ftpsClient = new FTPSClient(protocol);
ftpsClient.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
InputStream fis = new FileInputStream(file);
ftpsClient.connect("192.168.168.151", 22190);
ftpsClient.login("aubin", "aubin");//FTP的用户名和密码
// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
if (FTPReply.isPositiveCompletion(ftpsClient.sendCommand(
"OPTS UTF8", "ON"))) {
LOCAL_CHARSET = "UTF-8";
}
ftpsClient.execPBSZ(0);
ftpsClient.execPROT("P");
ftpsClient.setControlEncoding(LOCAL_CHARSET);
ftpsClient.enterLocalPassiveMode();
ftpsClient.setFileType(FTP.BINARY_FILE_TYPE);
//改变文件路径
boolean changeFlag = ftpsClient.changeWorkingDirectory("/home/aubin/indicator");
System.out.println(changeFlag);
if (ftpsClient.storeFile(fileName, fis)) {
System.out.println("成功");
} else {
System.out.println("失败");
}
ftpsClient.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
}
该代码可以上传文件,可以上传文件,可以上传文件
遇到的问题如下
1. 可以成功登陆,但是上传的时候连接超时
该问题因为登陆的时候用的是指定的端口,但是上传因为设置了被动模式会另外启用其它数据端口,而我的防火墙就打开了两个端口,所以就一直连接超时,
这边我处理方法是关闭防火墙,然后就可以了
[root@aubin vsftpd]# systemctl stop firewalld.service
还有一个方法是设置数据端口值,然后打开对应端口范围就可以了
2.可以上传文件,但是文件没有内容
之前我一直怀疑大概率是我代码的问题,小部分是ftps设置问题,就一直百度代码相关的操作,各种方法也试了,最后直接把日志打印出来,看日志什么问题
通过日志发现是配置文件的问题
[root@aubin vsftpd]# vim /etc/vsftpd/vsftpd.conf
加上如下配置
require_ssl_reuse=no //需要数据与控制流使用相同的ssl通道
为什么要设置这个,因为我们当我们连接ftp的时候就启用了一个ssl通道用于控制,当我们代码想要传输的时候,又设置了被动模式启用了另外的ssl通道,所以数据与控制流没有使用相同的ssl通道,我们就不能将这项配置设置为YES
设置好了之后关闭重启一下ftp服务
[root@aubin vsftpd]# systemctl stop vsftpd
[root@aubin vsftpd]# systemctl start vsftpd
最后实验一下,发现就可以了