private boolean uploadFile() {
try {
StopWatch watch = new StopWatch();
watch.start();
// 创建一个ftp对象
FTPClient ftp = new FTPClient();
//ftp.setControlEncoding("GBK");
// ftp连接上去
ftp.connect(ftpHost, ftpPort);
// ftp登录上去
ftp.login(ftpUsername, ftpPassword);
// 拿到返回码,进行判断是否连接成功
Integer reply = ftp.getReplyCode();
// 连接失败
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return false;
}
// 连接成功,准备上传
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
// 获取时间节点
Date now = new Date();
SimpleDateFormat formatFile = new SimpleDateFormat("yyyy-MM-dd");
String dateName = formatFile.format(now);
String dirName = String.format("/%s/%s", "OverDueStatic", dateName);
boolean makeResult = ftp.makeDirectory(dirName);
boolean changeResult = ftp.changeWorkingDirectory(dirName);
FileInputStream fis = new FileInputStream(String.format("%1$s/%2$s/%2$s.xlsx", excelPath, dateName));
boolean storeResult = ftp.storeFile(String.format("%s/%s.xlsx", dirName, dateName), fis);
fis.close();
watch.stop();
log.info(String.format("上传文件至ftp完成,耗时:%s", watch.getLastTaskTimeMillis()));
return true;
} catch (Exception e) {
// TODO: handle exception
throw new RuntimeException(e);
}
}
这是上传的相关代码,但是在makeDirectory方法一直返回false,后来查下资料才发现,这玩意不能创建多级目录,只能一层一层创建。
既然如此那就多写几个makeDirectory语句即可。
比如:
boolean makeResult = ftp.makeDirectory("/aa/");
boolean makeResult1 = ftp.makeDirectory("/aa/bb/");
踩坑:程序部署在linux服务器上,在windows上测试上传没问题,放到linux就出现在上传卡死的情况,不报错,不执行,无反应。
ftp.storeFile() 就是这个方法这里卡死,后来百度了下,说是因为在linux有主动和被动模式,linux有端口限制真正传输数据是通过
另外接口的,默认是主动,所以得改成被动模式,需要在ftp.storeFile()前加上 ftp.enterLocalPassiveMode(); 一定是ftp.storeFile()
前,不要在实例化时就掉用这个方法无效。像下面这样紧挨着(其实登录(login方法)成功后就可以设置了),一定要加上,不管主动还被动。
ftp.enterLocalPassiveMode();
boolean storeResult = ftp.storeFile()
再提一点,如果服务器存在这个文件没删除权限是无法覆盖掉的。
参考地址:https://blog.csdn.net/afei3418/article/details/54375858
1) 控制连接
客户端希望与FTP服务器建立上传下载的数据传输时,它首先向服务器的TCP 21端口发起一个建立连接的请求,FTP服务器接受来自客户端的请求,完成连接的建立过程,这样的连接就称为FTP控制连接。
2) 数据连接
FTP控制连接建立之后,即可开始传输文件,传输文件的连接称为FTP数据连接。FTP数据连接就是FTP传输数据的过程,它有两种传输模式
PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了XXXX端口,你过来连接我”。于是服务器从20端口向客户端的XXXX端口发送连接请求,建立一条数据链路来传送数据。
PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求,建立一条数据链路来传送数据。
来源:oschina
链接:https://my.oschina.net/u/3031369/blog/1863935