FTPClient - Java,上传文件

Posted

技术标签:

【中文标题】FTPClient - Java,上传文件【英文标题】:FTPClient - Java, upload file 【发布时间】: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();
    

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

【问题讨论】:

您是否尝试过半小时前的问题中的答案? ***.com/questions/5925438/… 是的,我现在正在使用 FTPClient。问题完全不同。 【参考方案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) 时,文件已损坏。

【讨论】:

以上是关于FTPClient - Java,上传文件的主要内容,如果未能解决你的问题,请参考以下文章

Java中使用FTPClient上传下载

Java中FTPClient上传中文目录中文文件名乱码问题解决方法好用

java FTPClient 上传文件 0kb 问题

JAVA利用commons.net.ftp.FTPClient的storeFileStream方法TXT文件上传. 已经转码UTF-16LE,上传后内容乱码

怎么用Java实现FTP上传

FtpClient上传文件速度非常慢,而且大小为0,上传失败