![](/img/trans.png)
[英]Apache commons NET FTP retrieve not working after file reading
[英]FTP file corrupt after download with 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();
}
从您共享的文件中可以清楚地看出,传输确实是在 text/ascii 模式下进行的。
虽然 FTP 规范可能没有要求,但对于某些 FTP 服务器(例如 FileZilla 服务器或 ProFTPD),您不能在登录前更改传输类型。但是像 IIS、ProFTPD 或 vsftpd 这样的服务器没有问题。 另一方面,FileZilla 服务器无论如何都默认为二进制模式(这是另一个违反规范的行为),因此您可能正在使用另一个。
无论如何,在.login
之后移动.setFileType
调用。 并测试其返回值。
并删除.setFileTransferMode
调用。 它不会对大多数服务器造成任何伤害,因为几乎没有任何服务器支持MODE C
,因此无论如何都会忽略调用。 但是,如果您遇到这样的服务器,它会中断传输,因为FTPClient
实际上不支持它。
虽然我的问题与上传损坏有关,但我通过在 ftp 登录后移动文件类型集解决了类似的问题(我不使用传输模式将其保留为默认值):
resultOk &= ftpClient.login(usr, pwd);
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
我在一些论坛看到,在调用登录方法之前设置二进制文件类型,可能会导致传输问题。 在此更改之前,下载 PDF 文件但显示损坏的字体和元素。 现在它起作用了。 希望它可以帮助某人。
使用包含空格的未转义路径时似乎会发生这种情况。 例如 C:/Documents and Settings/test
现在通过对空格使用转义路径来解决它。 谢谢你的帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.