FTPClient – Java,上传文件

我正在尝试做一个非常简单的文件上传。 我想要一个可以上传我告诉它的任何文件的Java FTPClient。 但pdf总是搞砸了,我的pdf编辑器(Adobe)不会打开它,说有一个I / O错误。

我正在使用以下课程:

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(); } 

为什么这不起作用,我该如何解决?

它不起作用,因为FTPClient的默认传输模式是FTP.ASCII_FILE_TYPE 。 您只需更新配置以在二进制模式下传输。

将其添加到您的文件中

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

我对xlsx文件有同样的问题,这是一个很好的解决方案。

人们经常忘记FTP有两种操作模式 – 一种用于文本文件,另一种用于二进制(图像)文件。 在过去,从命令行ftp客户端连接,我们要小心记住在请求文件之前设置传输模式 – 或者我们遇到了你似乎遇到的那种问题。 今天很多情况似乎默认为二进制,但显然不是你的。

您可能需要告诉您的ftp实现以二进制/图像模式传输。

尝试使用BufferedInputStream ,这是一个(工作)代码示例:

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

从文档

此方法不会关闭给定的InputStream。

所以在调用logout()之前关闭FileInputStream

尝试这个。

 objFtpClient.setFileType(FTP.BINARY_FILE_TYPE); objFtpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE); objFtpClient.enterLocalPassiveMode(); 

对我来说,只有ftp.setFileType(FTP.BINARY_FILE_TYPE,FTP.BINARY_FILE_TYPE)工作,而当我使用ftp.setFileTransferMode(FTP.BINARY_FILE_TYPE)时,文件变得腐败。

这看起来像是Commons .NET库中的一个错误 ,它影响了3.0版本。 尝试更新版本(3.0.1),修复了该错误。