2011-05-08 72 views
21

我試圖做一個非常簡單的文件上傳。我想要一個可以上傳我告訴它的任何文件的Java FTPClient。但PDF總是搞砸了,我的PDF編輯器(Adobe)不會打開它,說有一個I/O錯誤。FTPClient - 爪哇,上傳文件

我使用了下面的類:

import org.apache.commons.net.ftp.FTPClient; 
    .... 

    FTPClient client = new FTPClient(); 
    FileInputStream fis = null; 

    try { 
     client.connect("mydomain.com"); 
     client.login("user", "password"); 

     String filename = "myPDF.pdf"; 
     fis = new FileInputStream(filename); 

     client.storeFile("temp.pdf", fis); 
     fis.close(); 
     client.logout(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

爲什麼不這項工作,如何解決呢?

+0

你從半小時前嘗試在你的問題的答案? http://stackoverflow.com/questions/5925438/url-connection-ftp-in-java-simple-question – Aleadam 2011-05-08 04:47:41

+0

是的,我現在使用FTPClient。這個問題完全不同。 – CodeGuy 2011-05-08 04:51:50

回答

23

它不工作,因爲FTPClient默認傳輸模式是FTP.ASCII_FILE_TYPE。您只需要更新配置以二進制模式傳輸。

+1

要在二進制模式下傳輸:'ftp.setFileType(FTP.BINARY_FILE_TYPE)' – DLight 2016-12-05 10:17:30

3

嘗試使用BufferedInputStream,這是一個(工作)的代碼示例:

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f)); 
res = client.storeFile("File Name", bis); 
bis.close(); 
client.logout(); 
+0

仍然損壞。 :/ – CodeGuy 2011-05-08 04:40:06

+0

兩個簡短的問題 - 您是否嘗試在客戶機上打開該文件?你有沒有試過發送不同的文件? – MByD 2011-05-08 04:44:10

+0

是的,其他文件都很好。你是什​​麼意思在客戶機上打開它?基本上,我上傳後,我將它下載到我的本地機器。這是我擁有的網站上的一個ftp。 – CodeGuy 2011-05-08 04:47:35

2

documentation

此方法不會關閉給定的InputStream 。一個文本文件和其它二進制(圖像)文件 -

調用logout()

+0

+1我給了一個替代方案,但你指出了這個問題。 – MByD 2011-05-08 04:30:42

+0

它仍然損壞:/ – CodeGuy 2011-05-08 04:42:24

+0

@ reising1我不確定那麼,你有沒有嘗試@MByd的建議? – 2011-05-08 04:44:31

9

人們常常忘記了,FTP有兩種操作模式之前,因此關閉的FileInputStream。在過去的美好時代,從命令行ftp客戶端連接,我們會仔細記住在請求文件之前設置傳輸模式 - 否則我們會遇到您似乎遇到的問題。今天很多情況下似乎默認爲二進制,但不是顯然你的。

你可能需要告訴你的FTP實現以二進制格式/圖像模式轉移。

+0

您的評論剛剛解決了我遇到的兩年問題。祝賀你。 – 2015-04-01 16:13:57

21

添加到您的文件

ftp.setFileType(FTP.BINARY_FILE_TYPE, FTP.BINARY_FILE_TYPE); 
ftp.setFileTransferMode(FTP.BINARY_FILE_TYPE); 

我有XLSX文件同樣的問題,這是一個很好的解決方案。

+4

我不認爲你想調用setFileTransferMode這樣的 - 根據JavaDoc,它只是爲了獲取FTP。* _ TRANSFER_MODE常量。 – 2013-03-04 03:23:03

+1

-1,這個答案是錯誤的,並導致浪費我的時間。只有ftp.setFileType(FTP.BINARY_FILE_TYPE);是必需的,如果你把第二個參數ftp.setFileType(FTP.BINARY_FILE_TYPE,FTP.BINARY_FILE_TYPE)文件il損壞(使用pdf和xls) – amdev 2016-06-13 11:45:33

+0

FTPClient有什麼改變?因爲對我來說它是FTPClient.BINARY_FILE_TYPE。 – sigi 2017-10-15 13:18:58

1

試試這個。

objFtpClient.setFileType(FTP.BINARY_FILE_TYPE); 

objFtpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE); 

objFtpClient.enterLocalPassiveMode(); 
1

爲我只有ftp.setFileType(FTP.BINARY_FILE_TYPE,FTP.BINARY_FILE_TYPE)的工作,當我使用ftp.setFileTransferMode(FTP.BINARY_FILE_TYPE)文件是越來越腐敗的同時。