簡體   English   中英

使用 Apache Commons Net 下載后 FTP 文件損壞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM