使用Spring Integration无法将文件上传到sftp服务器

时间:2020-02-03 20:13:23

标签: java spring spring-boot spring-integration sftp

嗨,当我尝试使用Spring集成将csv文件上传到SFTP服务器时,出现以下异常,无法确定发生了什么问题,但是在服务器上我可以看到类似 10132_1234.csv.writing的文件,但是书写操作从未完成,而通过winscp我可以复制而没有任何问题,请帮助解决此问题,

 Caused by: org.springframework.messaging.MessagingException: Failed
   to write to 'file-location/10132_1234.csv.writing' while uploading
   the file; nested exception is
   org.springframework.core.NestedIOException: failed to write file;
   nested exception is 3: Forbidden     at
   org.springframework.integration.file.remote.RemoteFileTemplate.sendFileToRemoteDirectory(RemoteFileTemplate.java:560)
    at
   org.springframework.integration.file.remote.RemoteFileTemplate.doSend(RemoteFileTemplate.java:337)
    ... 88 common frames omitted`enter code here`

   Caused by: org.springframework.core.NestedIOException: failed to
   write file; nested exception is 3: Forbidden     at
   org.springframework.integration.sftp.session.SftpSession.write(SftpSession.java:177)
    at
   org.springframework.integration.file.remote.session.CachingSessionFactory$CachedSession.write(CachingSessionFactory.java:235)
    at
   org.springframework.integration.file.remote.RemoteFileTemplate.doSend(RemoteFileTemplate.java:568)
    at
   org.springframework.integration.file.remote.RemoteFileTemplate.sendFileToRemoteDirectory(RemoteFileTemplate.java:557)
    ... 89 common frames omitted

   Caused by: com.jcraft.jsch.SftpException: Forbidden  at
   com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2873)
    at com.jcraft.jsch.ChannelSftp._put(ChannelSftp.java:594)   at
   com.jcraft.jsch.ChannelSftp.put(ChannelSftp.java:540)    at
   com.jcraft.jsch.ChannelSftp.put(ChannelSftp.java:492)    at
   org.springframework.integration.sftp.session.SftpSession.write(SftpSession.java:174)
    ... 92 common frames omitted

这是我的上传代码:

@Bean
public SessionFactory<LsEntry> sftpSessionFactory() {
    DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
    factory.setHost(sftpHost);
    factory.setPort(sftpPort);
    factory.setUser(sftpUser);
    if (sftpPrivateKey != null) {
        factory.setPrivateKey(sftpPrivateKey);
        factory.setPrivateKeyPassphrase(sftpPrivateKeyPassphrase);
    } else {
        factory.setPassword(sftpPasword);
    }
    factory.setAllowUnknownKeys(true);
    return new CachingSessionFactory<>(factory);
}

@Bean
@ServiceActivator(inputChannel = "toSftpChannel")
public MessageHandler handler() {
    logger.info("Entering into MessageHandler for uploading the file to SFTP server");
    SftpMessageHandler handler = new SftpMessageHandler(sftpSessionFactory());
    handler.setRemoteDirectoryExpression(new LiteralExpression(sftpRemoteDirectory));
    handler.setFileNameGenerator(message -> {
        if (message.getPayload() instanceof File) {
            return ((File) message.getPayload()).getName();
        } else {
            throw new IllegalArgumentException("File expected as payload.");
        }
    });
    return handler;
}

@MessagingGateway
public interface UploadGateway {
    @Gateway(requestChannel = "toSftpChannel")
    void upload(File file);

}

1 个答案:

答案 0 :(得分:0)

只需检查您是否提供了有效的文件路径作为目的地。它应该是写入上游文件内容的确切文件路径

springframework.integration.sftp.session.SftpSession.write(InputStream inputStream, String destination)