Spring Integration 7.0.x版本中的SFTP持久化的仅一次接收文件列表过滤器、SftpClient.DirEntry(目录项)以及长文件名

后端开发 2026-07-11

为什么在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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章