【问题标题】:Apache Java FTP client does not switch to binary transfer mode on some serversApache Java FTP 客户端在某些服务器上不切换到二进制传输模式
【发布时间】:2016-07-20 20:22:29
【问题描述】:

我正在使用 org.apache.commons.net.ftp 库来处理 FTP 服务器。我使用了大约 5 个 FTP 服务器,其中一个不能正常工作(对我来说)。对于上传文件,我也使用方法ftpClient.setFileType(FTP.BINARY_FILE_TYPE),但在此服务器上上传文件的大小与我本地硬盘上的大小不同。它通常是 MP3 文件,当我尝试播放上传的 MP3 时,会有一些嗡嗡声。 我怀疑 FTP 服务器的配置有误,但负责这台服务器的公司不太可能进行一些更改。 还有一个非常重要的注意事项:当我使用 Total Commander 或 WinSCP 上传文件时,上传的文件是正确的,大小相同。

这是我的代码:

public class FtpConnection {
    String FTP_SERVER;
    String FTP_USER;
    String FTP_PASSWORD;
    int FTP_PORT;
    FTPClient ftpClient;
    int attempts = 3;
    long FILE_SIZE;

    public FtpConnection() {
        FTP_SERVER = StradaAd.FTP_SERVER;
        FTP_USER = StradaAd.FTP_USER;
        FTP_PASSWORD = StradaAd.FTP_PASSWORD;
        FTP_PORT = StradaAd.FTP_PORT;

        ftpClient = new FTPClient();

        ftpClient.setCopyStreamListener(streamListener);

        ftpClient.setBufferSize(1024 * 1024 * 1024);
        ftpClient.setConnectTimeout(240000);
        ftpClient.setDataTimeout(240000);
        try {
            ftpClient.connect(FTP_SERVER, FTP_PORT);
            ftpClient.setControlKeepAliveTimeout(300);
            ftpClient.enterLocalPassiveMode();
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

            int replyCode = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(replyCode)) {
                StradaAd.errorArea.append("Operation failed. Server reply code: " + replyCode);
                return;
            }
            boolean success = ftpClient.login(FTP_USER, FTP_PASSWORD);

            if (!success) {
                //unsuccess
            }
        } catch (IOException ex) {
          //error
        }
    }

    public boolean uploadFile(File source, String destination, String chain) {
        try {
            FILE_SIZE = source.length();

            ftpClient.cwd("//" + chain + "/REKLAMY/");

            for(int i=0;i<attempts;i++) {
                ftpClient.storeFile(destination, new FileInputStream(source));

                for(FTPFile f : ftpClient.listFiles()) {
                    if(f.getName().equals(destination) && f.getSize() == source.length())
                        return true;
                }
            }
            return false;
        } catch (IOException ex) {
            Logger.getLogger(FtpConnection.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }    
}

有人知道如何更改此代码或将此 FTP 服务器设置为具有相同大小的上传文件的解决方案吗? 提前感谢您的帮助。

【问题讨论】:

    标签: java ftp apache-commons-net


    【解决方案1】:

    你打电话给FTPClient.setFileType method 太早了。

    至少ProFTPD 或 FileZilla FTP 服务器在验证后重置默认传输模式 (FTPClient.login)。

    .setFileType 调用移到.login 之后。

    【讨论】:

      猜你喜欢
      • 2013-05-18
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      • 2016-03-04
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多