FTPClient - Java,上传文件

时间:2011-05-08 04:21:58

标签: java ftp ftp-client apache-commons-net

我正在尝试做一个非常简单的文件上传。我想要一个可以上传我告诉它的任何文件的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 个答案:

答案 0 :(得分:25)

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

答案 1 :(得分:23)

将此添加到您的文件

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

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

答案 2 :(得分:9)

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

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

答案 3 :(得分:3)

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

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

答案 4 :(得分:2)

来自documentation

  

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

在调用logout()

之前关闭FileInputStream

答案 5 :(得分:1)

试试这个。

objFtpClient.setFileType(FTP.BINARY_FILE_TYPE);

objFtpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE);

objFtpClient.enterLocalPassiveMode();

答案 6 :(得分:1)

仅限我使用ftp.setFileType(FTP.BINARY_FILE_TYPE,FTP.BINARY_FILE_TYPE),而当我使用ftp.setFileTransferMode(FTP.BINARY_FILE_TYPE)时文件已损坏。

答案 7 :(得分:0)

这看起来像a bug in the Commons NET library,影响了3.0版。尝试更新版本(3.0.1),修复了错误。