2011-05-08 84 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)文件是越来越腐败的同时。