【问题标题】:Apache FTPClientApache FTP客户端
【发布时间】:2014-08-13 16:45:58
【问题描述】:

我正在使用 Apache 的库编写一个非常简单的 FTPClient 应用程序。

我所做的只是从服务器下载一个 jar 文件。也不例外,当我在 MacOS 上运行时,应用程序运行良好,一旦我在 Windows 中运行相同的代码,下载的文件就会比服务器上的文件小。但是,也不例外,一切似乎都很好。

我快疯了,我用的是二进制模式,代码简单到我不敢相信我从昨天开始就卡在上面了!!!

请帮忙!

public boolean loadLatest(){
    FTPClient ftp = new FTPClient();
    try {
        ftp.connect("server address");
        ftp.setControlKeepAliveTimeout(300);
        ftp.enterLocalPassiveMode();
        String fu = "username";
        ftp.login(fu, "password");
        int reply = ftp.getReplyCode();
        if (FTPReply.isPositiveCompletion(reply)) {
            ftp.setFileTransferMode(FTP.BINARY_FILE_TYPE);
            ftp.enterLocalPassiveMode();
            FTPFilter filter = new FTPFilter(); 
            FTPFile[] finfo = ftp.listFiles(".",filter);
            if (finfo.length==0){
                return false;
            }

            File currentJar = new File("sm.jar");

            FileOutputStream output;
            output = new FileOutputStream("sm.jar");
            if (ftp.retrieveFile(finfo[0].getName(), output)==false){
                    System.out.println("Bad file!");
            }
            output.close();             
            ftp.logout();
        }
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }

    return true;
}

这是我的代码:

谢谢

【问题讨论】:

  • 您自己采取了哪些具体步骤来解决这个问题?
  • 你说下载的文件更小,到底有多小?文件的内容是什么?是空文件吗?
  • 我已经在 MacOS 和 Windows 上进行了测试,结果始终相同。我在服务器上的原始文件是 2,612,350 字节,在 MacOS 上下载的文件大小完全相同,但在 Windows 上下载的文件是 2,622,171 字节。而且这是一个jar文件,所以windows上下载的文件已经损坏,无法使用。
  • 此外,最初我正在替换 jar 文件本身(获取新版本),即使它在 Mac 上运行,我想这可能是由于在 VM 中运行的同一个文件上写入!所以我添加了一个小助手 jar,它会检查实际的 jar 并下载是否有新文件,然后启动一个进程,然后我注意到无论下载的文件是否正确。

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


【解决方案1】:

您可能误用了 Apache API。

public boolean setFileTransferMode(int mode) throws IOException

设置传输模式。默认传输模式 FTP.STREAM_TRANSFER_MODE 如果从不调用此方法或调用连接方法。

可能的值为STREAM_TRANSFER_MODESTREAM_TRANSFER_MODEBLOCK_TRANSFER_MODE

所以你的下面一行:

ftp.setFileTransferMode(FTP.BINARY_FILE_TYPE);

不是API的有效使用,并且没有设置客户端在BINARY模式下工作。

你所说的FTP传输模式,实际上是由另一种方法控制的:

public boolean setFileType(int fileType) throws IOException

设置要传输的文件类型。这应该是FTP.ASCII_FILE_TYPEFTP.BINARY_FILE_TYPE 等之一。文件类型只有在您要更改类型时才需要设置。更改后,新类型将一直有效,直到您再次更改它。如果从不调用此方法,则默认文件类型为 FTP.ASCII_FILE_TYPE。 服务器默认应该是 ASCII(参见 RFC 959),但是许多 ftp 服务器默认为 BINARY。为确保所有服务器的正确操作,请始终在连接到服务器后指定适当的文件类型。

注意当前调用任何连接方法都会将类型重置为FTP.ASCII_FILE_TYPE

很可能,您需要使用最后一种方法将模式更改为BINARY,然后您的传输应该可以了。

【讨论】:

  • 我确实有 setFileTransferMode,我将它设置为 BINARY,正如您在我的代码中看到的那样。
  • setFileTransferMode 不处理二进制/ASCII 传输,正如我所写的。 setFileType 可以。你没有做你认为你在做的事。
  • 太棒了!这就是问题所在!有趣的是,这在 Mac 上运行良好,而只有在 Windows 上才出现问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-07
  • 2012-03-20
  • 1970-01-01
  • 2019-03-02
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多