使用Apache Commons Net下载FTP文件后出现文件损坏。

6
这个程序下载的文件大小几乎相同,但是某些行有所不同。每个回答都指向二进制文件类型,但这并没有帮助解决问题(传输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个回答

6
从您分享的文件中可以清楚地看出,传输确实是以文本/ASCII模式进行的。
虽然可能不是FTP规范所要求的,但对于一些FTP服务器(例如FileZilla服务器或ProFTPD),您无法在登录之前更改传输类型。但像IIS、ProFTPD或vsftpd这样的服务器却没有问题。另一方面,FileZilla服务器默认为二进制模式(这是另一个违反规范的行为),因此您可能正在使用另一个服务器。
无论如何,请在.login之后调用.setFileType。并测试其返回值。
删除.setFileTransferMode调用。对于大多数服务器来说,它不会造成任何伤害,因为几乎没有服务器支持MODE C,因此该调用会被忽略。但如果您遇到支持它的服务器,它将破坏传输,因为FTPClient实际上不支持它。

4

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

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

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

感谢您的评论,我已经编辑了帖子。那是一个写作错误。 - Luc Chevaux
好的,但是现在你的回答和我的一样。 - Martin Prikryl
谢谢 - 这解决了我的问题。在用Java下载tar文件并且用7zip提取时一直出现一个错误,"payload数据结束后还有一些数据"。 - Alex

-1

当使用包含空格的未转义路径时,似乎会出现问题。例如:C:/Documents and Settings/test

现在通过使用转义空格的路径来解决了这个问题。感谢您的帮助。


1
那不会破坏文件,它会阻止整个下载。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接