2012-02-29 56 views
6

當我用下面的代碼下載文件時,它只是將文件寫入本地的目標文件,但文件大小都爲零。 有人可以說爲什麼會發生這種情況,以及如何解決它?ftp不能在java中正確下載文件?

import org.apache.commons.net.ftp.FTPClient; 
import org.apache.commons.net.ftp.FTPFile; 
import java.io.FileOutputStream; 
import java.io.IOException; 

public class FtpDownload { 
public static void main(String[] args) { 
    FTPClient client = new FTPClient(); 
    FileOutputStream fos = null; 
    String filename = "config.zip"; 
    try { 
     client.connect("ftpsrv"); 
     client.login("user", "user"); 

     for (FTPFile file : client.listFiles()) { 
      filename = "C:\\tmp\\user\\" + file.getName(); 
      if (file.isFile()) { 
       fos = new FileOutputStream(filename); 
       client.retrieveFile(filename, fos); 
       System.out.println(file.getName()); 
      } else if (file.isDirectory()) { 
       System.out.println("directory: " + file.getName()); 
      } 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (fos != null) { 
       fos.close(); 
      } 
      client.disconnect(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 
} 
+0

這與Java Swing庫有什麼關係?爲什麼使用Swing標籤? – 2012-02-29 15:18:06

+0

您的流處理是一場噩夢,您只關閉最後一個FileOutputStream。 – home 2012-02-29 15:22:06

回答

15

Apache文檔我來的結論,即BINARY_FILE_TYPE尚未落戶搜索後。我添加了以下代碼,一切都正常。感謝所有幫助你的人。

try { 
    client.connect(ftpServer); 
    client.login(username, password); 
    // following line fixed my zip file corruption issue. 
    client.setFileType(FTP.BINARY_FILE_TYPE); 
+0

這是一個很大的幫助。這修復了下載的文件問題,「歸檔文件不完整」。非常感謝! – Richard 2012-11-20 20:41:00

+0

這修復了我從FTP請求中獲得的一些損壞的gzipped(.gz)文件,謝謝。 – Ina 2013-03-29 14:07:46

+0

順便說一下,最後一行應該是: ** client.setFileType(FTPClient.BINARY_FILE_TYPE); ** – 2013-09-21 14:05:55

1

嘗試在每次迭代閉流中的循環

fos.close(); 

你的代碼是不正確的練習,因爲你有一個for循環,創造了新的流每次迭代,但只有關閉最後一個

+0

下載後,當我打開文件,我得到以下錯誤:'錯誤:不可恢復的Zip文件讀取錯誤。' – itro 2012-03-01 07:39:14

4

您使用的是本地路徑變量指向遠程文件:

filename = "C:\\tmp\\user\\" + file.getName(); 
... 
client.retrieveFile(filename, fos); 

你要指向遠程文件,而不是本地目標,就像這樣:

client.retrieveFile(file.getName(), fos); 

此外,請確保您讀取每個文件後關閉fos流,而不是右底。如果獲得commons.io庫,則可以使用IOUtils.closeQuietly(fos);來避免嵌套的try-catch塊。

您還應該使用BINARY文件類型和BLOCK傳輸方式傳送zip文件:

client.setFileTransferMode(FTPClient.BLOCK_TRANSFER_MODE); 
client.setFileType(FTPClient.BINARY_FILE_TYPE); 
+0

下載後,當我打開文件,我得到以下錯誤:**錯誤:不可恢復的Zip文件讀取錯誤。只有zip文件。當我下載.csv文件時,它是可以的。 – itro 2012-03-01 07:38:27

+0

這聽起來像是一個完全不同的問題。你能下載並手動打開zip文件嗎?這聽起來像服務器上的config.zip文件已損壞。 – seanhodges 2012-03-01 11:52:32

+0

往下看頁面看起來像是你打敗了我這個@itro,但是爲了完整性我更新了我的答案。 – seanhodges 2012-03-01 12:53:45