2013-10-06 106 views
1

我知道以前有很多类似的问题。我看了他们所有人并尝试了所有可能的解决方案,包括更换了几台FTP服务器,但我仍然无法解决我的问题。尽管FTP命令行没有问题。我也关闭了防火墙。这里是我的代码片段:android FTPClient无法上传文件 - 收到FTP响应421。服务器关闭连接

 ftpClient.login(username, password); 

     int mode = ftpClient.getDataConnectionMode(); 
     if(mode == ftpClient.PASSIVE_LOCAL_DATA_CONNECTION_MODE) 
      ftpClient.enterLocalPassiveMode(); 
     else if(mode == ftpClient.ACTIVE_LOCAL_DATA_CONNECTION_MODE) 
      ftpClient.enterLocalActiveMode(); 

     ftpClient.setFileType(FTP.BINARY_FILE_TYPE, FTP.BINARY_FILE_TYPE); 
     ftpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE); 
     //ftpClient.setPassiveNatWorkaround(false); 

     if(LOGD) Log.d("before create out"); 
     String out = orderToString(); 
     if(LOGD) Log.d("out="+out); 
     InputStream stream = new ByteArrayInputStream(out.getBytes("UTF-8")); 

     if(LOGD) Log.d("before upload orders.xml"); 
     boolean res = ftpClient.storeFile("orders.xml", stream); 
     if(!res) Log.d("store file failed"); 
     ftpClient.completePendingCommand(); 
     stream.close(); 

这里是logcat的:

............................ ............

d /销售经理(408):之前创建了d /销售经理(408): 出= d /销售经理(408):d /销售经理(408 ):
1 D/SalesManager(408):2013-10-06 12:07:39 D/SalesManager(408):1 D/SalesManager(408):617.25 D/SalesManager(408):D/SalesManager(408): D/SalesManager(408):上传orders.xml之前D/SntpClient(60): 请求时间失败:java.net.SocketException:地址族不是 受W/System.err(408)协议支持: org.apache.commons.net.ftp.FTPConnectionClosedException:收到FTP响应 421。服务器关闭连接。 d/SntpClient(60):请求 时间失败:java.net.SocketException异常:地址家庭不受 协议 MainActivity $ LoadAsyncTask.doInBackground(MainActivity.java:1) W/System.err的(408)的支持:在 android.os.AsyncTask $ 2.call(AsyncTask.java:185)W/System.err(408):
at java.util.concurrent.FutureTask $ Sync。内核运行(FutureTask.java:305) W/System.err(408):at java.util.concurrent.FutureTask.run(FutureTask.java:137) W/System.err(408):at java.util .concurrent.ThreadPoolExecutor。 runWorker(ThreadPoolExecutor.java:1068)W/System.err(408):at java.util.concurrent.ThreadPoolExecutor $ Worker。 运行(ThreadPoolExecutor.java:561)W/System.err的(408):在 java.lang.Thread.run(Thread.java:1096)

.......... .............

编辑我曾经成功下载过一个文本文件,但从未上传过一个文本文件。在测试过程中,有一次我上传了一半的文本文件 - 在服务器上创建了一个空的同名文件。

回答

0

使用ftp4j解决了这个问题。几天浪费commons.ftpclient

0

我成功上传文件到FTP服务器通过删除completePendingCommand()。 只需storeFile + getReplyCode来检查响应代码。

ftpClient.setDefaultTimeout(1000*60); 
ftpClient.connect(server, port); 
ftpClient.login(user, pass); 

int replyCode=ftpClient.getReplyCode(); 
//log or check response 

ftpClient.enterLocalPassiveMode(); 
ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 

InputStream inputStream=new FileInputStream(zipFile); 
ftpClient.storeFile(zipFile.getName(), inputStream); 
inputStream.close(); 

replyCode=ftpClient.getReplyCode(); 
//log or check response