1

以前にも似たような質問がたくさんあったことは知っています。それらすべてを調べ、いくつかの FTP サーバーを変更するなど、考えられるすべての解決策を試しましたが、それでも問題を解決できませんでした。ただし、FTP コマンド ラインには問題はありません。ファイアウォールもオフにしました。ここに私のコードスニペットがあります:

        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();

ログキャットは次のとおりです。

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

D/SalesManager( 408): 作成前 out D/SalesManager( 408): out= D/SalesManager( 408): D/SalesManager( 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):
java.util.concurrent.FutureTask$Sync で。innerRun(FutureTask.java:305) W/System.err(408): java.util.concurrent.FutureTask.run(FutureTask.java: 137) で W/System.err(408): java.util.concurrent で。 ThreadPoolExecutor。runWorker(ThreadPoolExecutor.java:1068) W/System.err(408): java.util.concurrent.ThreadPoolExecutor$Worker で。実行 (ThreadPoolExecutor.java:561) W/System.err(408): java.lang.Thread.run(Thread.java:1096) で

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

EDITテキストファイルを正常にダウンロードしたことはありますが、テキストファイルをアップロードすることはありません。テスト中に、テキスト ファイルのアップロードが半分完了したことがあります。サーバー上に同じ名前の空のファイルが作成されます。

4

2 に答える 2

0

ftp4jを使用して問題を解決しました。commons.ftpclient で数日無駄になる

于 2013-10-06T23:29:39.463 に答える
0

completePendingCommand() を削除することで、FTP サーバーへのファイルのアップロードに成功しました。応答コードを確認するには、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
于 2015-12-15T15:46:08.447 に答える