2012-03-01 300 views
1

我試圖從我的Java應用程序傳輸文件(config.zip.zip和artikels.csv)到FTP服務器程序工作,文件被傳輸,但是當我去打開文件夾時,文件已損壞,文件大小小於原始文件大小。 artikels.csv文件具有較少的行然後信號artikels.csv但zip文件不能完全打開。爲什麼?我該如何解決這個問題?爲什麼java ftp上傳文件損壞到服務器?

import org.apache.commons.io.FilenameUtils; 
import org.apache.commons.net.ftp.FTP; 
import org.apache.commons.net.ftp.FTPClient; 
import org.apache.commons.net.ftp.FTPFile; 

public static void upload(List<String> files){ 
    FTPClient client = new FTPClient(); 
    FileInputStream fis = null; 
    try { 
     client.connect(ftpServer); 
     client.login(username, password); 
     client.setFileType(FTP.BINARY_FILE_TYPE); 

     for(String filename:files){ 
      fis = new FileInputStream(filename); 
      boolean uploadOk = client.storeFile(FilenameUtils.getName(filename), fis); 
      System.out.println("Uploading status is: "+uploadOk); 
     } 
      client.completePendingCommand(); 
      client.logout(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (fis != null) { 
       fis.close(); 
      } 
      client.disconnect(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

回答

1

這是您正在運行的確切代碼嗎?似乎懷疑completePending Command()和logout()是在你的文件迭代循環中。你不應該有更像以下的東西嗎?

... 

    client.connect(ftpServer); 
    client.login(username, password); 
    client.setFileType(FTP.BINARY_FILE_TYPE); 
    for(String filename:files){ 
     fis = new FileInputStream(filename); 
     String s = FilenameUtils.getName(filename); 
     System.out.println(s); 
     boolean uploadOk = client.storeFile(s, fis); 
     System.out.println("Uploading status is: "+uploadOk); 
    } 
    client.completePendingCommand(); 
    client.logout(); 
    ... 
+0

你是否在uploadOK中找回「真」值? – GeoGriffin 2012-03-01 15:57:19

+0

是的,我這樣做,我成功了,我看到文件上傳成功。 – itro 2012-03-20 15:52:53

0

您需要在循環中添加fis.close()

由於您在循環瀏覽很多文件,因此您需要在每個文件後關閉您的FileInputStream