我正在尝试使用apache commons-net进行ftp文件传输.
问题是文件间歇性地到达服务器损坏.'腐败'我的意思是winrar告诉我一个zip文件有一个'意外的归档结束'.有时文件是完全空的.我注意到,对于较大的文件(100kb +),这种情况更多,但对于小文件也会发生(20kb).
我知道上传的源zip文件是有效的,只有243kb.
我没有从代码中得到任何错误/异常.
这是正在执行的代码:
try
{
int CON_TIMEOUT = (int) TimeUnit.SECONDS.toMillis(20); // fail if can't connect within 20 seconds
int LIVE_TIMEOUT = (int) TimeUnit.MINUTES.toMillis(5); // allow up to 5 minutes for data transfers
FTPClient client = new FTPClient();
client.setConnectTimeout(CON_TIMEOUT);
client.setDataTimeout(LIVE_TIMEOUT);
client.connect(host);
client.setSoTimeout(LIVE_TIMEOUT);
client.login(user, pass);
client.changeWorkingDirectory(dir);
log("client ready");
File file = new File(filePath);
String name = new Date().getTime() + "-" + file.getName();
InputStream fis = null;
try
{
fis = new FileInputStream(file);
if (!client.storeFile(name, fis))
throw new RuntimeException("store …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Ant任务上传文件.如果我直接使用Ant文件被上传,但是如果我通过Maven调用ant任务(使用maven-antrun-plugin),我会收到以下错误:
发生了Ant BuildException:执行此行时发生以下错误:
/home/me/proj/build.xml:15: Problem: failed to create task or type ftp
Cause: the class org.apache.tools.ant.taskdefs.optional.net.FTP was not found.
This looks like one of Ant's optional components.
Action: Check that the appropriate optional JAR exists in
-ANT_HOME/lib
Run Code Online (Sandbox Code Playgroud)
Ant-commonsnet.jar显然可用于Ant:
$ ls $ANT_HOME/lib | grep ant-commons-net
ant-commons-net.jar
Run Code Online (Sandbox Code Playgroud)
Ant类路径是为maven-antrun-plugin单独定义的,还是我错过了什么?
ftpClient.connect与没有活动ftp服务的现有主机一起使用时,超时仅在5分钟后发生,这太长了。
我尝试设置各种超时(setDefaultTimeout,setDataTimeout),但没有任何改变。
FtpClient从SocketClient那里继承有一个setConnectTiemout方法,但是当我使用java.lang.NoSuchMethodError: org/apache/commons/net/ftp/FTPClient.setConnectTimeout它时,运行它时会得到一个。这似乎是由于某些J2SW 1.2兼容性,如Commons-net FAQ中所述:
问:如何设置连接超时?http://wiki.apache.org/commons/Net/FrequentlyAskedQuestions
他们建议SocketFactory使用特定的超时从扩展的Socket类实现自己的创建对象。但是,当尝试使用时,ftpClient.setSocketFactory我也会得到一个java.lang.NoSuchMethodError。
有什么帮助我可以减少连接超时吗?
我正在开发一个applet,允许从webapp上传FTP ...
发送操作正常,但我希望能够取消正在存储的文件.
我对线程不是很流利.我的第一次尝试是在取消线程中调用ftp.abort(),但是当storeFile方法完成时才调用abort方法,就像发送线程锁定ftp对象一样.
所以我更改了代码以中断发送线程并在复制流监听器中检查它.文件存储按预期停止,但ftp.abort()调用挂起应用程序,它永远不会完成.
有任何想法吗?
谢谢,菲利普
发送操作:
botaoEnviar.setEnabled(false);
botaoCancelar.setEnabled(true);
textField.requestFocus();
threadEnvio = new Thread(new Runnable()
{
@Override
public void run()
{
FileInputStream fis = null;
try
{
if(arquivoSelecionado == null)
{
throw new IllegalArgumentException("Arquivo deve ser informado");
}
try
{
ftp = new FTPClient();
ftp.connect("192.168.1.243");
}
catch(Exception e)
{
throw new FtpConnectionException("Não foi possível conectar no servidor FTP", e);
}
if(!ftp.login("c001", "0AJF2J36"))
{
throw new IllegalArgumentException("Não foi possível autenticar no servidor FTP");
}
ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
ftp.setCopyStreamListener(new CopyStreamAdapter()
{
@Override
public …Run Code Online (Sandbox Code Playgroud) 由此下载的文件大小几乎相同,但某些行有所不同。每个答案都指向二进制文件类型。但这无济于事。有人知道这个问题(传输 PDF)吗?
FTPClient ftpClient = new FTPClient();
OutputStream outputStream = null;
boolean resultOk = true;
try {
ftpClient.connect(host, port);
ftpClient.enterLocalPassiveMode();
ftpClient.setFileTransferMode(FTP.COMPRESSED_TRANSFER_MODE);
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
if (showMessages) {
System.out.println(ftpClient.getReplyString());
}
resultOk &= ftpClient.login(usr, pwd);
if (showMessages) {
System.out.println(ftpClient.getReplyString());
}
outputStream = new FileOutputStream(localResultFile);
resultOk &= ftpClient.retrieveFile(remoteSourceFile, outputStream);
outputStream.flush();
outputStream.close();
if (showMessages) {
System.out.println(ftpClient.getReplyString());
}
if (resultOk == true) {
resultOk &= ftpClient.deleteFile(remoteSourceFile);
}
resultOk &= ftpClient.logout();
if (showMessages) {
System.out.println(ftpClient.getReplyString());
}
} finally {
ftpClient.disconnect();
}
Run Code Online (Sandbox Code Playgroud) 我正在编写一个连接到 FTP 服务器以读取一些文件的 Rest 服务,然后对读取的数据进行一些操作以服务于服务请求。我正在使用 Apache 公共资源FTPClient。
作为临时解决方案,我正在创建一个FTPClient对象 - 然后连接它 - 然后使用凭据登录 -FTPClient在我的数据访问层中的一个方法(客户端是该方法的本地 - 这样做不是线程安全的),然后在退出方法之前(即......读取文件后)断开它。问题是,FTPClient登录需要 3-7 秒,这是非常高的。所以我正在考虑实现一个FTPClientPool可以在数据访问方法中提供一个已经准备好的客户端。
是否已经存在任何这样的 ClientPools?
如果是,那么我应该选择哪一种?
如果不是,实现的难点是一旦创建和连接, apache FTPClient 存活多久?无限时间??(我的意思是 FTPClient 的默认保持活动时间是多少 - 客户端断开连接后的空闲时间 - 因为我在 java 文档中看到了各种时间。:()接下来的问题是你如何让它始终保持活动状态??(可能会在一个单独的线程中定期发送 NOOPS ??)关于我应该如何前进的任何帮助都非常有帮助。
感谢和问候
java multithreading connection-pooling ftp-client apache-commons-net
我使用 commons-net-3.2.jar 中的 FTPClient.java、FTPFile.java、FTPListParseEngine.java 来访问位于 EET 时区的 ftp 服务器(Linux 计算机)上的文件。在访问文件时,如果我尝试查看文件的时区和时间戳,时间戳以 UTC 格式显示,但时区显示为访问文件的位置的时区。
预计两者都应采用 EET 格式。
示例:假设 FTP 服务器(在 EET 区域)上的文件 example.txt 于 2014 年 11 月 27 日上午 8:28:20 创建。使用上述 jar 访问文件(在 EET 时区)时,FTPFile.java 的 getTimestamp 方法将返回时间为 11/27/2014 6:28:20 AM EET。
相反,它应该是 11/27/2014 8:28:20 AM EET。
这个问题如何解决。
我正在尝试连接到 FTPS 服务器。我可以很好地连接 FileZilla 并列出服务器中的文件、下载等。
我正在尝试使用 org.apache.commons.net.ftp 包中的 FTPSClient 使用 Java 连接到此 FTP 服务器。这就是我正在尝试的方式:
FTPSClient ftp = new FTPSClient();
ftp.connect(HOST, 7021);
ftp.enterLocalPassiveMode();
ftp.login(USERNAME, PASSWORD);
final int list = ftp.list();
System.out.println("List returned: " + list);
Run Code Online (Sandbox Code Playgroud)
我得到的回应是:
FTPSClient ftp = new FTPSClient();
ftp.connect(HOST, 7021);
ftp.enterLocalPassiveMode();
ftp.login(USERNAME, PASSWORD);
final int list = ftp.list();
System.out.println("List returned: " + list);
Run Code Online (Sandbox Code Playgroud)
根据维基百科,425 的意思是:“无法打开数据连接”。
但是,尝试创建一个文件夹效果很好:
FTPSClient ftp = new FTPSClient();
ftp.connect(HOST, 7021);
ftp.enterLocalPassiveMode();
ftp.login(USERNAME, PASSWORD);
ftp.mkd("/laylaylom");
Run Code Online (Sandbox Code Playgroud)
因此,如果我运行此代码并连接 FileZilla,我将在 FTP 服务器中看到文件夹“laylaylom”。
我也尝试过:
FTPSClient ftp = new …Run Code Online (Sandbox Code Playgroud) 我正在使用 Java Apache Commons Net 库从 FTP 服务器下载文件。作为起点,我试图重用来自https://www.codejava.net/java-se/networking/ftp/java-ftp-file-upload-tutorial-and-example 的代码。通常,代码执行时没有问题/异常,但是对于一个特定的 FTP 服务器 ( ftp://ftp.nasdaqtrader.com/symboldirectory/nasdaqlisted.txt ) 我收到以下错误:
org.apache.commons.net.MalformedServerReplyException:截断的服务器回复:'220'
我的代码如下:
String server = "ftp.nasdaqtrader.com";
int port = 21;
String user = "anonymous";
String pass = "pw";
FTPClient ftpClient = new FTPClient();
try {
ftpClient.connect(server, port);
ftpClient.login(user, pass);
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
// APPROACH #1: using retrieveFile(String, OutputStream)
String remoteFile1 = "/symboldirectory/nasdaqlisted.txt";
File downloadFile1 = new File("C:\\filedirectory\\nasdaqlisted.txt");
OutputStream outputStream1 =
new BufferedOutputStream(new FileOutputStream(downloadFile1));
boolean success = ftpClient.retrieveFile(remoteFile1, outputStream1);
outputStream1.close();
if (success) {
System.out.println("File #1 …Run Code Online (Sandbox Code Playgroud) 使用 Apache commons-net 的 Java FTPSClient 进行会话恢复是一个已知问题。会话恢复是 FTPS 服务器数据连接所需的一项安全功能。Apache FTPSClient 不支持会话恢复,并且 JDK API 使得构建自定义实现变得困难。有一些使用反射的解决方法,请参阅此答案和此commons-net bug 条目。
我在 JDK 11 中使用了这样的解决方法(请参阅下面的片段),并针对本地 FileZilla 服务器对其进行了测试。它适用于 FileZilla Server 0.9.6,但不适用于 FileZilla Server 1.2.0,这是撰写本文时的最新版本。在该版本中,当尝试建立数据连接时,服务器会响应:
425 Unable to build data connection: TLS session of data connection not resumed.
Run Code Online (Sandbox Code Playgroud)
正如我所说,FileZilla Server 0.9.6 适合我进行会话恢复的方式,并且我确保激活了要求会话恢复的设置。
在 FileZilla Server 1.2.0 中,此类设置现在是隐式设置的,无法通过 GUI 更改,也许根本不能更改。我可以调整一些服务器设置才能使其正常工作吗?或者是我如何实施解决方法的问题?有人遇到类似的问题吗?
这是我正在使用的解决方法:
public class FTPSClientWithSessionResumption extends FTPSClient {
static {
System.setProperty("jdk.tls.useExtendedMasterSecret", "false");
System.setProperty("jdk.tls.client.enableSessionTicketExtension", "false");
}
@Override
protected void _connectAction_() throws IOException {
super._connectAction_();
execPBSZ(0);
execPROT("P"); …Run Code Online (Sandbox Code Playgroud)