![](/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.