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);linux
// 获取时间节点
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);
}
}windows
这是上传的相关代码,可是在makeDirectory方法一直返回false,后来查下资料才发现,这玩意不能建立多级目录,只能一层一层建立。服务器
既然如此那就多写几个makeDirectory语句便可。测试
好比:.net
boolean makeResult = ftp.makeDirectory("/aa/");
boolean makeResult1 = ftp.makeDirectory("/aa/bb/");excel
踩坑:程序部署在linux服务器上,在windows上测试上传没问题,放到linux就出如今上传卡死的状况,不报错,不执行,无反应。orm
ftp.storeFile() 就是这个方法这里卡死,后来百度了下,说是由于在linux有主动和被动模式,linux有端口限制真正传输数据是经过对象
另外接口的,默认是主动,因此得改为被动模式,须要在ftp.storeFile()前加上 ftp.enterLocalPassiveMode(); 必定是ftp.storeFile()blog
前,不要在实例化时就掉用这个方法无效。像下面这样紧挨着接口
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端口发送链接请求,创建一条数据链路来传送数据。