27

我正在尝试进行非常简单的文件上传。我想要一个可以上传我告诉它的任何文件的 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();
    }

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

4

8 回答 8

32

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

于 2011-08-29T19:45:33.423 回答
24

将此添加到您的文件中

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

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

于 2011-11-15T08:58:04.730 回答
10

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

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

于 2011-05-08T05:52:21.997 回答
3

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

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));
res = client.storeFile("File Name", bis);
bis.close();
client.logout();
于 2011-05-08T04:26:32.790 回答
2

文档

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

所以在调用之前关闭 FileInputStreamlogout()

于 2011-05-08T04:27:22.720 回答
1

对我来说,只有 ftp.setFileType(FTP.BINARY_FILE_TYPE, FTP.BINARY_FILE_TYPE) 有效,而当我使用 ftp.setFileTransferMode(FTP.BINARY_FILE_TYPE) 时,文件已损坏。

于 2014-10-12T14:52:29.787 回答
1

尝试这个。

objFtpClient.setFileType(FTP.BINARY_FILE_TYPE);

objFtpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE);

objFtpClient.enterLocalPassiveMode();
于 2013-10-14T13:43:53.827 回答
0

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

于 2011-07-17T01:05:48.217 回答