解决
我正在制作一个必须与ftp服务器联系的桌面应用程序,将上传的文件是图像。我正在尝试它,但我无法上传尽管被连接,问题是当我想上传文件时,该方法不起作用并返回false。代码如下:
public boolean subeFTP(String archivoLocal, String archivoServer){
boolean resultado=false;
FTPClient ClienteFTP=new FTPClient();
//Se toma el nombre del archivo local
String aux = archivoLocal;
aux = aux.substring(aux.lastIndexOf("\\")+1);
try {
//Establece el timeout del servidor en 5 minutos para evitar desconexiones
ClienteFTP.setControlKeepAliveTimeout(300);
//Conexión al servidor
ClienteFTP.connect(prop_servidor, prop_puertoServidor);
//Pone el ftp en modo pasivo para recibir un archivo, permanecerá así mientras no se cambie
ClienteFTP.enterLocalPassiveMode();
//Login
resultado=ClienteFTP.login(prop_usuarioFtp, prop_passFtp);
//Comprobación de la conexión
int reply = ClienteFTP.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ClienteFTP.logout();
ClienteFTP.disconnect();
throw new Exception("El servidor FTP ha rechazado la conexión, error:\n" + ClienteFTP.getReplyString());
}
//Se cambia el directorio al requerido
resultado = resultado && ClienteFTP.changeWorkingDirectory(prop_directorioServidor);
//Tipo de archivo y envío
resultado = resultado && ClienteFTP.setFileType(FTP.BINARY_FILE_TYPE);
//resultado = resultado && ClienteFTP.setFileTransferMode(FTP.BLOCK_TRANSFER_MODE);
BufferedInputStream buffIn=new BufferedInputStream(new FileInputStream(archivoLocal));
resultado = resultado && ClienteFTP.storeFile(archivoServer+aux, buffIn);
System.out.println(ClienteFTP.getReplyString());
buffIn.close();
ClienteFTP.logout();
ClienteFTP.disconnect();
resultado=true;
} catch (SocketException e) {
System.out.println("Fallo 1");
e.printStackTrace();
resultado=false;
} catch (IOException e) {
System.out.println("Fallo 2");
resultado=false;
e.printStackTrace();
} catch (Exception e) {
resultado=false;
e.printStackTrace();
}
return resultado ;
}
答案 0 :(得分:3)
您应该进入本地被动模式。使用以下methd ftp.enterLocalPassiveMode()
根据文件
将当前数据连接模式设置为 PASSIVE_LOCAL_DATA_CONNECTION_MODE。仅将此方法用于数据 客户端和服务器之间的传输。这种方法导致PASV(或 EPSV)命令在每次打开之前发送到服务器 数据连接,告诉服务器打开一个数据端口 客户端将连接以进行数据传输。 FTPClient将保留 在PASSIVE_LOCAL_DATA_CONNECTION_MODE中,直到模式被更改为 调用一些其他方法,如enterLocalActiveMode()
我还建议您致电ftpClient.setControlKeepAliveTimeout(timeoutInMilliseconds);
Set the time to wait between sending control connection keepalive messages when processing file upload or download.