19

これを理解してください。コードは例外なく正しく実行されます。

try
{
    FTPClient ftp = new FTPClient();
    ftp.connect(server);
    if(!ftp.login(username, password))
    {
        ftp.logout();
        return false;
    }
    int reply = ftp.getReplyCode();
    if (!FTPReply.isPositiveCompletion(reply))
    {
        ftp.disconnect();
        return false;
    }
    InputStream in = new FileInputStream(localfile);
    ftp.setFileType(ftp.BINARY_FILE_TYPE, ftp.BINARY_FILE_TYPE);
    ftp.setFileTransferMode(ftp.BINARY_FILE_TYPE);
    Store = ftp.storeFile(destinationfile, in);
    in.close();
    ftp.logout();
    ftp.disconnect();
}
catch (Exception ex)
{
    ex.printStackTrace();
    return false;
}
return Store;

しかし、returnステートメントは常にfalseを返し、ファイルはサーバーにアップロードされません。誰かがこれを手伝ってください。

ちなみに、私はオフィスネットワークにいます。--->プロキシを追加する必要がありますか?


File file = new File("C:\\Users\\sg0214273\\Desktop\\seagate\\seagate.txt");
FileInputStream input = new FileInputStream(file);
client.setFileType(FTP.BINARY_FILE_TYPE);
if (!client.storeFile(file.getName(), input)) {
  System.out.println("upload failed!");
} 
reply = client.getReplyCode();

if(!FTPReply.isPositiveCompletion(reply)) {
  System.out.println("upload failed!");
}
Login success...
230 User ******** logged in.
upload failed!-----> is form boolean return value of storefile 
upload failed!---------> is from replycode...
Logout from FTP server...

手伝ってください。

4

5 に答える 5

26

正確な失敗メッセージは、FtpClient#getReplyCode()を呼び出すことで見つけることができます。そのページから(私の強調):

接続直後は、応答コードを確認する必要がある唯一のリアルタイムです(接続はvoid型であるため)。FTPClientのすべてのFTPコマンドメソッドの規則では、ブール値またはその他の値を返します。ブールメソッドは、FTPサーバーからの正常な完了応答でtrueを返し、エラー状態または失敗をもたらす応答でfalseを返します。ブール値以外の値を返すメソッドは、FTPコマンドによって生成されたより高いレベルのデータを含む値を返します。応答の結果、エラー状態または失敗が発生した場合はnullを返します。成功または失敗の原因となる正確なFTP応答コードにアクセスする場合は、成功または失敗した後にgetReplyCodeを呼び出す必要があります。

戻りコードの意味を確認するには、Wikipedia:FTPサーバーの戻りコードのリストを参照してください。

于 2011-11-16T15:52:48.600 に答える
7

トピックはかなり古いですが、多分私は他の人を助けるでしょう。FileZillaがFTPサーバーに送信するものと私のプログラムが行ったことを比較しました。私はftp.enterLocalPassiveMode()それを機能させるために使用する必要がありました、ftp.pasv()良くありません:)

また、デバッグにはgetReplyString()、のみよりも使用する方が適切getReplyCode()です。

于 2012-01-25T13:32:24.147 に答える
5

storeFile()次のようにファイルを転送する前に、パッシブモードに切り替えるようにコードを変更します。

...
ftp.setFileTransferMode(ftp.BINARY_FILE_TYPE);
ftp.enterLocalPassiveMode();//Switch to passive mode
Store = ftp.storeFile(destinationfile, in);
in.close();
...

お役に立てば幸いです。

于 2014-02-04T13:56:15.160 に答える
1

このコードのapacheライブラリを追加してくださいこれは実装されたクラスです

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

残りのインポートクラスはjava.ioまたはjava.netからのものです

public boolean upload(String server,String username,String password,File localfile ){
        boolean Store=false;
        try{
        FTPClient ftp = new FTPClient();
               // ftp.connect(server);
    /* you can use either code which is written above above or below code as ftp port 20 is used for the data transfer and port 21 is used for command and controlls */
           ftp.connect(InetAddress.getByName(server),21); 
    //here 'server' is your domain name of ftp server or url
                if(!ftp.login(username, password))
                {
                    ftp.logout();
                    return false;
                }
          ftp.sendNoOp();//used so server timeout exception will not rise
                int reply = ftp.getReplyCode();
                if (!FTPReply.isPositiveCompletion(reply))
                {
                    ftp.disconnect();
                    return false;
                }
              ftp.enterLocalPassiveMode(); /* just include this line here and your code will work fine */
                InputStream in = new FileInputStream(localfile);
              // ftp.setFileType(ftp.BINARY_FILE_TYPE, ftp.BINARY_FILE_TYPE);
               ftp.setFileType(FTP.BINARY_FILE_TYPE);
               // ftp.setFileTransferMode(ftp.BINARY_FILE_TYPE);
                Store = ftp.storeFile(destinationfile, in);
                in.close();
             //ftp.disconnect();
     //here logout will close the connection for you
                ftp.logout();

            }
            catch (Exception ex)
            {
                ex.printStackTrace();
                return false;
            }
        return Store;
    }
于 2015-03-02T09:59:36.897 に答える
0

ftp.enterLocalPassiveMode();を使用してみてください。ftp.storeFile(destinationfile、in);の前

于 2015-09-16T00:13:38.407 に答える