标签: apache-commons-net

commons-net ftp正在上传损坏的文件

我正在尝试使用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)

java ftp apache-commons-net

6
推荐指数
1
解决办法
5338
查看次数

通过Maven中的Ant FTP任务上传文件

我正在尝试使用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单独定义的,还是我错过了什么?

ant ftp maven-2 apache-commons-net

6
推荐指数
1
解决办法
5442
查看次数

设置FtpClient的连接超时

ftpClient.connect与没有活动ftp服务的现有主机一起使用时,超时仅在5分钟后发生,这太长了。

我尝试设置各种超时(setDefaultTimeout,setDataTimeout),但没有任何改变。

FtpClientSocketClient那里继承有一个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

有什么帮助我可以减少连接超时吗?

java ftp-client apache-commons-net

6
推荐指数
2
解决办法
3万
查看次数

Apache Commons Net FTPClient中止文件存储

我正在开发一个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)

java ftp apache-commons-net

6
推荐指数
1
解决办法
2260
查看次数

使用 Apache Commons Net 下载后 FTP 文件损坏

由此下载的文件大小几乎相同,但某些行有所不同。每个答案都指向二进制文件类型。但这无济于事。有人知道这个问题(传输 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)

java ftp apache-commons-net

6
推荐指数
2
解决办法
2045
查看次数

FTP客户端池 - Java

我正在编写一个连接到 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

5
推荐指数
1
解决办法
4476
查看次数

commons-net-3.2:时间戳和时区不匹配

我使用 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。

这个问题如何解决。

java apache-commons-net

5
推荐指数
1
解决办法
1428
查看次数

org.apache.commons.net.ftp.FTPSClient 在列表命令后返回 425

我正在尝试连接到 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 ftp ftps apache-commons-net

5
推荐指数
1
解决办法
3005
查看次数

java FTP org.apache.commons.net.MalformedServerReplyException:截断的服务器回复:'220'

我正在使用 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)

java ftp apache-commons-net

5
推荐指数
1
解决办法
2545
查看次数

如何建立与 FileZilla Server 1.2.0 的 FTPS 数据连接

使用 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)

java filezilla ftps apache-commons-net session-reuse

5
推荐指数
1
解决办法
2386
查看次数