用的是以下依赖包
implementation 'commons-net:commons-net:3.5'
每次上传都是0B,问题出现在没有调用FTPClient.enterLocalPassiveMode();
这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。
为什么要这样做呢,因为ftp server可能每次开启不同的端口来传输数据,但是在linux上,由于安全限制,可能某些端口没有开启,所以就出现阻塞。
借鉴于这位老哥杨航JAVA
所以代码加上就可以了
public static boolean uploadFile(String url, int port, String username,
String password, String path, String filename, InputStream input) {
boolean success = false;
FTPClient ftp = new FTPClient();
// LogUitl.Infor(url+port+username+password+path);
try {
int reply;
ftp.connect(url, port);// 连接FTP服务器
// 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
ftp.login(username, password);//登录
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return success;
}
ftp.enterLocalPassiveMode();//被动模式
ftp.setFileType(FTP.BINARY_FILE_TYPE);//上传上去的图片数据格式()一定要写这玩意,不然在服务器就打不开了
if (!ftp.changeWorkingDirectory(path)) {
if (ftp.makeDirectory(path)) {
ftp.changeWorkingDirectory(path);
}
}
// ftp.changeWorkingDirectory(path);
//设置成其他端口的时候要添加这句话
// ftp.enterLocalPassiveMode();
ftp.storeFile(filename, input);
input.close();
ftp.logout();
success = true;
} catch (IOException e) {
Log.e("NWJ", "uploadFile: "+e.getMessage() );
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
Log.e("NWJ", "uploadFile: "+ioe.getMessage() );
}
}
}
return success;
}