FTPClient-Java,上传文件

FTPClient-Java,上传文件,java,ftp,ftp-client,apache-commons-net,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 {

我正在尝试做一个非常简单的文件上传。我想要一个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();
    }
为什么这不起作用,我如何修复它?

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

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

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


因此,在调用
logout()

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


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

这看起来像,这影响了3.0版。请尝试更新的版本(3.0.1),该版本修复了该错误。

它不起作用,因为默认的传输模式是
FTP.ASCII\u文件类型。您只需更新配置以二进制模式传输。

将其添加到您的文件中

ftp.setFileType(FTP.BINARY_FILE_TYPE, FTP.BINARY_FILE_TYPE);
ftp.setFileTransferMode(FTP.BINARY_FILE_TYPE);
我对xlsx文件也有同样的问题,这是一个很好的解决方案。

试试这个

objFtpClient.setFileType(FTP.BINARY_FILE_TYPE);

objFtpClient.setFileTransferMode(FTP.BINARY_FILE_TYPE);

objFtpClient.enterLocalPassiveMode();

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

两个简短的问题-您是否尝试在客户端计算机上打开该文件?您是否尝试发送其他文件?是的,其他文件都可以。在客户机上打开它是什么意思?基本上,在我上传之后,我会把它下载到我的本地机器上。这是我自己网站上的ftp。在上传文件之前,你打开文件成功了吗?也许你的下载机制有问题--我不确定这些,只是想帮忙:是的。原始文件很好。呃,我不知道为什么它不起作用。它适用于我尝试过的其他文件,比如txt文件。PDF有些特别之处。@reising1我不确定,你有没有尝试@MByd的建议?你有没有尝试半小时前问题中的答案?是的,我现在正在使用FTP客户端。问题是完全不同的。我认为你不想这样调用setFileTransferMode——根据JavaDoc,它只需要FTP.*.\u TRANSFER\u MODE常量。-1,这个答案是错误的,会浪费我的时间。仅ftp.setFileType(ftp.BINARY\u文件类型);是必需的,如果您输入第二个参数ftp.setFileType(ftp.BINARY\u FILE\u TYPE,ftp.BINARY\u FILE\u TYPE),则文件il已损坏(带有pdf和xls)在FTPClient上发生了更改?因为对我来说它是FTPClient.BINARY文件类型。你的评论刚刚解决了我两年来遇到的一个问题。干杯。要以二进制模式传输:
ftp.setFileType(ftp.binary\u FILE\u TYPE)