web-dev-qa-db-ja.com

FtpClient storeFileは常にFalseを返します

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

        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を返し、ファイルはサーバーにアップロードされません。誰か助けてください。

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


          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...

助けてください

17
RaviKiran

正確なエラーメッセージは、 FtpClient#getReplyCode() を呼び出すことで確認できます。そのページから(私の強調):

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

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

25
Matthew Farwell

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

そしてデバッグにはgetReplyCode()だけよりもgetReplyString()を使用する方が良い

5
jasiustasiu

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

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

お役に立てば幸いです。

2

このコード用の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;
    }
1

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

0
Thiago Pires