You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SftpOutboundGateway MGet运行时切换远程目录遇下载无响应问题

Spring Integration SFTP MGet 无法通过Header传递目录下载文件问题

问题根源

你当前的配置中,SftpOutboundGateway同时设置了mget命令的远程路径参数和remoteDirectoryExpression,导致远程路径被重复拼接,最终指向一个不存在的目录,所以没有文件被下载,且MGet在无匹配文件时默认不会抛出异常。

具体来说:

  • mget命令的第三个参数已经指定为headers['remoteDirectory'],即远程路径为Header传入的值
  • 额外设置的setRemoteDirectoryExpression(parser.parseExpression("headers['remoteDirectory']"))会将这个值作为基础远程目录,最终远程路径变成基础目录 + 命令参数路径,也就是/home/pi/sftp/patient//home/pi/sftp/patient/,显然这个目录不存在

修正后的配置

只需要移除多余的remoteDirectoryExpression配置即可:

//SFTP Config
@ServiceActivator(inputChannel = "sftpChannelMGetTest")
public MessageHandler mGetHandlerTest() {
    ExpressionParser parser = new SpelExpressionParser();

    SftpOutboundGateway gateway = new SftpOutboundGateway(sftpSessionFactory(), "mget", 
        parser.parseExpression("headers['remoteDirectory']").getExpressionString());
    gateway.setLocalDirectoryExpression(parser.parseExpression("headers['localDirectory']"));
    gateway.setFileExistsMode(FileExistsMode.REPLACE);
    // 移除下面这行多余的配置
    // gateway.setRemoteDirectoryExpression(parser.parseExpression("headers['remoteDirectory']"));

    return gateway;
}

补充说明

  • MGet命令的第三个参数支持通配符,如果你需要下载目录下的所有文件,可以在传入remoteDirectory时加上/*,比如/home/pi/sftp/patient/*
  • 如果需要排查这类问题,可以开启Spring Integration的DEBUG日志,查看实际拼接的远程路径和SFTP操作细节

内容的提问来源于stack exchange,提问作者Shail

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:02:36