Spring Integration 7.0.x版本中的SFTP持久化的仅一次接收文件列表过滤器、SftpClient.DirEntry(目录项)以及长文件名
为什么在Spring Integration 7.0.x SftpPersistentAcceptOnceFileListFilter方法的fileName会改为返回longFilename?
eg.: for file name on SFTP server: FILENAME.txt and prefix 'prefix_' , in METADATA_STORE we have record:
prefix_-rwxrwxrwx 1 1000 1000 346 Mar 11 2026 FILENAME.txt
根据远程持久化文件列表过滤器(Remote Persistent File List Filters)的文档,该方法应获取目录路径加上简单的文件名。

解决方案
We did that as a fix to this issue: https://github.com/spring-projects/spring-integration/issues/10162。
那里在 SftpSession 的逻辑是这样的:
return StreamSupport.stream(this.sftpClient.readDir(remoteDirToUse).spliterator(), false)
.filter((entry) -> !isPattern || PatternMatchUtils.simpleMatch(remoteFile, entry.getFilename()))
.map((entry) -> {
String longFilename = entry.getLongFilename();
if (StringUtils.hasText(longFilename)) {
return entry;
}
String filename = entry.getFilename();
return new SftpClient.DirEntry(filename, remoteDirToUse + '/' + filename, entry.getAttributes());
});
所以,很明显你的SFTP服务器返回了问题中所示的那个 entry.getLongFilename()。而且那个信息根本没有任何目录信息。
看起来我们需要把它修正为无条件且基于目录的方式,就像我们对FTP那样,例如:
enhancedFTPFile.setLongFileName(remoteDir + '/' + ftpFile.getName());
请提出一个GH issue,我们会尽快修复。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。