使用sftp出站网关从远程目录中获取文件列表

时间:2015-04-24 19:30:26

标签: spring spring-integration sftp

我正在尝试做一些我觉得相对简单明了的事情。我试图从特定的远程目录中获取文件列表,然后根据日期找出我想要对文件做什么。

我遇到的问题是,一旦建立sftp连接并执行ls命令,它似乎总是从根目录“/”返回文件,而不是转到我指定的远程目录。我已经尝试了远程目录和/或表达式的各种迭代来获取我想要无效的目录中的文件。

我希望从远程目录中检索文件: “/网站/ cmsftp /网站/现场/ FTP / cmsoss /出境”

配置为:

<int-sftp:outbound-gateway id="remoteftpLS"
                           session-factory="dealerDataSftpSessionFactory"
                           request-channel="sftpRequestChannel"
                           command="ls"
                           remote-file-separator="/"
                           remote-directory="/sites/cmsftp/site/live/ftp/cmsoss/outbound"
                           expression="''"
                           charset="UTF-8"
                           local-directory="${ftpOutputPath}"
                           reply-channel="fileListSplitterInputChannel" />

我也尝试过:

<int-sftp:outbound-gateway id="remoteftpLS"
                           session-factory="dealerDataSftpSessionFactory"
                           request-channel="sftpRequestChannel"
                           command="ls"
                           remote-file-separator="/"
                           remote-directory="/sites/cmsftp/site/live/ftp/cmsoss/outbound"
                           expression="payload"
                           charset="UTF-8"
                           local-directory="${ftpOutputPath}"
                           reply-channel="fileListSplitterInputChannel" />

这里没有错误。我发现它始终是root的第一种方式是当我放置一个表达式来查找名为特定方式的文件时,注意到我得到了一个异常,说明没有这样的文件。只有这样我才将表达式更改为有效负载,或者“''”,它从根目录返回了一个文件列表。在此网关下游的自定义拆分器中的断点处停止是我如何验证它是从根目录中提取文件。

我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:1)

你可以使用网关
例如:

package org.springframework.integration.samples.ftp; // sample
/**
 * @author Gary Russell
 * @since 2.1
 *
 */
public interface ToFtpFlowGateway {
    public List<Boolean> lsGetAndRmFiles(String dir);
}

并在xml文件中:

<int:gateway id="gw" service-interface="org.springframework.integration.samples.ftp.ToFtpFlowGateway"
        default-request-channel="sftpRequestChannel"/>

最后:

List<Boolean> results = toFtpFlow.lsGetAndRmFiles("/sites/cmsftp/site/live/ftp/cmsoss/outbound");

请参阅ftp sample

答案 1 :(得分:1)

试试这个:

<int-sftp:outbound-gateway id="remoteftpLS"
                       session-factory="dealerDataSftpSessionFactory"
                       request-channel="sftpRequestChannel"
                       command="ls"
                       remote-file-separator="/"
                       expression="'/sites/cmsftp/site/live/ftp/cmsoss/outbound'"
                       charset="UTF-8"
                       local-directory="${ftpOutputPath}"
                       reply-channel="fileListSplitterInputChannel" />

参考手册:

  

对于所有命令,命令所作用的PATH由&#39;表达式&#39;提供。网关的属性。对于mget命令,表达式可能会计算为&#39; &#39;,这意味着检索所有文件,或者某些目录/ &#39;等