FtpClient storeFile总是返回False

时间:2011-11-16 15:26:53

标签: java ftp-client apache-commons-net

请弄清楚这一点。代码正常运行,没有任何例外。

        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;

Buttttttttt

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

请帮忙

5 个答案:

答案 0 :(得分:22)

通过调用FtpClient#getReplyCode()可以找到确切的失败消息。从那页(我的重点):

  

连接后立即是您需要检查的唯一实时   回复代码(因为connect的类型为void)。的惯例   FTPClient中的所有FTP命令方法都是这样的   返回一个布尔值或其他值。布尔方法返回   如果从FTP服务器成功完成回复并且为false,则为true   导致错误情况或失败的回复。方法   返回布尔值以外的值返回包含的值   FTP命令生成的更高级别数据,如果是回复则为null   导致错误状态或失败。 如果要访问   确切的FTP回复代码导致成功或失败,您必须调用   成功或失败后的getReplyCode。

要查看返回代码的含义,您可以看到Wikipedia: List of FTP server return codes

答案 1 :(得分:5)

主题很老但也许我会帮助其他任何人。我比较了FileZilla发送到FTP服务器和我的程序所做的事情。我需要使用ftp.enterLocalPassiveMode()使其工作,ftp.pasv()没有好处:))

调试最好使用getReplyString()而不是getReplyCode()

答案 2 :(得分:2)

修改代码以在使用storeFile()传输文件之前切换到被动模式,如下所示:

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

希望有所帮助。

答案 3 :(得分: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;

rest import class来自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;
    }

答案 4 :(得分:0)

尝试使用ftp.enterLocalPassiveMode();在ftp.storeFile(destinationfile,in);

之前