【问题标题】:FTPClient - Java, upload fileFTPClient - Java,上传文件
【发布时间】:2011-08-21 00:00:25
【问题描述】:

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

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

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

  • 两个简短的问题 - 您是否尝试在客户端计算机上打开文件?您是否尝试过发送其他文件?
  • 是的,其他文件都可以。你是什​​么意思在客户端机器上打开它?基本上,上传后,我将其下载到本地计算机。这是我拥有的网站上的 ftp。
  • 您在上传文件之前是否成功打开文件?也许您的下载机制有问题? --我不确定这些,只是想帮忙:S
  • 是的。原文件就好了。呃,我不确定为什么它不起作用。它适用于我尝试过的其他文件,如 txt 文件。 pdf 的一些特别之处。
【解决方案2】:

来自documentation

此方法不会关闭给定的 输入流。

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

【讨论】:

  • @reising1 我不确定,你有没有尝试过@MByd 的建议?
【解决方案3】:

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

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

【讨论】:

  • 您的评论刚刚解决了我两年来的问题。为你干杯。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

    • 以二进制方式传输:ftp.setFileType(FTP.BINARY_FILE_TYPE)
    【解决方案6】:

    将此添加到您的文件中

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

    我在处理 xlsx 文件时遇到了同样的问题,这是一个很好的解决方案。

    【讨论】:

    • 我不认为你想这样调用 setFileTransferMode ——根据 JavaDoc,它意味着只接受 FTP.*_TRANSFER_MODE 常量。
    • -1,这个答案是错误的,会浪费我的时间。只有 ftp.setFileType(FTP.BINARY_FILE_TYPE);是必需的,如果您将第二个参数 ftp.setFileType(FTP.BINARY_FILE_TYPE, FTP.BINARY_FILE_TYPE) 文件损坏(使用 pdf 和 xls)
    • FTPClient 有什么变化吗?因为对我来说它是 FTPClient.BINARY_FILE_TYPE。
    【解决方案7】:

    试试这个。

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

    【讨论】:

      【解决方案8】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-06
        • 2013-07-07
        • 2013-04-07
        • 2014-06-18
        • 2012-05-18
        • 1970-01-01
        • 1970-01-01
        • 2020-02-11
        相关资源
        最近更新 更多