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利用commons.net.ftp.FTPClient的storeFileStream方法TXT文件上传. 已经转码UTF-16LE,上传后内容乱码