使用Apache Commons Net下载后,FTP文件损坏

时间:2018-04-23 21:30:40

标签: java ftp apache-commons-net

由此下载的文件几乎相同,但在某些行中有所不同。每个答案都指向二进制文件类型。但这无济于事。 有没有人知道这个问题(转移PDF)?

FTPClient ftpClient = new FTPClient();
OutputStream outputStream = null;
boolean resultOk = true;

try {
    ftpClient.connect(host, port);
    ftpClient.enterLocalPassiveMode();
    ftpClient.setFileTransferMode(FTP.COMPRESSED_TRANSFER_MODE);
    ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
    if (showMessages) {
        System.out.println(ftpClient.getReplyString());
    }
    resultOk &= ftpClient.login(usr, pwd);
    if (showMessages) {
        System.out.println(ftpClient.getReplyString());
    }

    outputStream = new FileOutputStream(localResultFile);
    resultOk &= ftpClient.retrieveFile(remoteSourceFile, outputStream);
    outputStream.flush();
    outputStream.close();

    if (showMessages) {
        System.out.println(ftpClient.getReplyString());
    }
    if (resultOk == true) {
        resultOk &= ftpClient.deleteFile(remoteSourceFile);
    }

    resultOk &= ftpClient.logout();
    if (showMessages) {
        System.out.println(ftpClient.getReplyString());
    }
} finally {

    ftpClient.disconnect();
}

3 个答案:

答案 0 :(得分:1)

从您共享的文件中可以清楚地看到,转移确实发生在text / ascii模式中。

尽管FTP规范可能不需要使用某些FTP服务器(例如FileZilla服务器),但在登录之前无法更改传输类型。但IIS,ProFTPD或vsftpd等服务器没有问题。另一方面,FileZilla服务器默认为二进制模式(这是另一个违反规范的行为),所以你可能正在使用另一个。

无论如何,请在.setFileType之后移动.login来电。并测试其回报值。

然后移除.setFileTransferMode来电。它对大多数服务器没有任何伤害,因为几乎没有任何服务器支持MODE C,因此无论如何都会忽略该调用。但是如果遇到服务器,它会破坏传输,因为FTPClient实际上不支持它。

答案 1 :(得分:0)

虽然我的问题与上传损坏有关,但我通过在ftp登录后移动文件类型集解决了类似的问题(我不使用传输模式将其保留为默认值):

resultOk &= ftpClient.login(usr, pwd);
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);

我在一些论坛上看到,在调用登录方法之前设置二进制文件类型可能会导致传输问题。进行此更改之前,将下载PDF文件,但显示损坏的字体和元素。现在可以了。希望它可以帮助某人。

答案 2 :(得分:-1)

使用包含空格的未转义路径时似乎会发生这种情况。例如。 C:/ Documents and Settings / test

现在通过使用空间的转义路径解决了问题。谢谢你的帮助