我正在尝试做一个非常简单的文件上传 . 我想要一个可以上传我告诉它的任何文件的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();
}
为什么这不起作用,我该如何解决?
8 回答
试试这个 .
对于我来说,只有ftp.setFileType(FTP.BINARY_FILE_TYPE,FTP.BINARY_FILE_TYPE)工作,而当我使用ftp.setFileTransferMode(FTP.BINARY_FILE_TYPE)文件变得腐败 .
这看起来像a bug in the Commons NET library,它影响了3.0版本 . 尝试更新版本(3.0.1),修复了该错误 .
尝试使用BufferedInputStream,这是一个(工作)代码示例:
来自documentation
所以在调用
logout()
之前关闭FileInputStream它不起作用,因为FTPClient的默认传输模式是
FTP.ASCII_FILE_TYPE
. 您只需要更新配置以在二进制模式下传输 .将其添加到您的文件中
我对xlsx文件有同样的问题,这是一个很好的解决方案 .
人们经常忘记FTP有两种操作模式 - 一种用于文本文件,另一种用于二进制(图像)文件 . 在过去的好日子里,从命令行ftp客户端连接,我们会仔细记住在请求文件之前设置传输模式 - 或者我们遇到了你似乎遇到的那种问题 . 今天很多情况似乎默认为二进制,但显然不是你的 .
您可能需要告诉您的ftp实现以二进制/图像模式传输 .