Код не может работать так, как хотелось бы. Он достигает сервера, поднимая ""
Код: Выделить всё
implementation("org.springframework.integration:spring-integration-sftp")
implementation("org.springframework.integration:spring-integration-file")
implementation("org.apache.sshd:sshd-sftp:2.13.1")
implementation("com.jcraft:jsch:0.1.55")
Код: Выделить всё
@Service
public class SFTPUploadService {
private static final Logger LOGGER = Logger.getLogger(SFTPUploadService.class.getName());
private final SftpRemoteFileTemplate sftpRemoteFileTemplate;
@Autowired
public SFTPUploadService(DefaultSftpSessionFactory sftpSessionFactory) {
this.sftpRemoteFileTemplate = new SftpRemoteFileTemplate(sftpSessionFactory);
}
public void uploadFile(File file, String remoteDirectory) throws IOException {
LOGGER.log(Level.INFO, "Starting file upload to SFTP server...");
try {
sftpRemoteFileTemplate.execute(session -> {
try (FileInputStream fis = new FileInputStream(file)) {
LOGGER.log(Level.INFO, "Uploading file: " + file.getName());
session.write(fis, remoteDirectory + file.getName());
LOGGER.log(Level.INFO, "File uploaded successfully to " + remoteDirectory + file.getName());
}
catch (IOException e) {
LOGGER.log(Level.SEVERE, "Failed to upload file: " + e.getMessage(), e);
throw e;
}
return null;
});
} catch (Exception e) {
LOGGER.log(Level.SEVERE, "Failed to execute on session: " + e.getMessage(), e);
throw new IOException("Failed to upload file to SFTP server", e);
}
}
}
@Configuration
открытый класс SFTPConfig {
Код: Выделить всё
@Bean
public DefaultSftpSessionFactory sftpSessionFactory() {
DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory();
factory.setHost(host);
factory.setPort(port);
factory.setUser(user);
factory.setPassword(password);
factory.setAllowUnknownKeys(true); // Set to false in production and use a known host file.
// Load known hosts file from classpath
Resource knownHosts = new ClassPathResource("known_hosts");
factory.setKnownHostsResource(knownHosts);
return factory;
}
.338+03: 00 INFO 26468 --- [http-nio-9191-exec-1]
o.s.web.servlet.DispatcherServlet: Инициализация сервлета
'dispatcherServlet'
.338+03:00 DEBUG 26468 - -- [http-nio-9191-exec-1] o.s.web.servlet.DispatcherServlet: обнаружен
StandardServletMultipartResolver
.338+03:00 DEBUG 26468 --- [http-nio-9191-exec- 1] o.s.web.servlet.DispatcherServlet: обнаружен
AcceptHeaderLocaleResolver
.338+03:00 DEBUG 26468 --- [http-nio-9191-exec-1] o.s.web.servlet.DispatcherServlet: обнаружен фиксированный ThemeResolver
.339+03:00 DEBUG 26468 --- [http-nio-9191-exec-1] o.s.web.servlet.DispatcherServlet: обнаружен
org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator@ 49bd35d0
.339+03:00 DEBUG 26468 --- [http-nio-9191-exec-1] o.s.web.servlet.DispatcherServlet: обнаружен
org.springframework.web.servlet.support.SessionFlashMapManager @1ac34417
.339+03:00 DEBUG 26468 --- [http-nio-9191-exec-1] o.s.web.servlet.DispatcherServlet:
enableLoggingRequestDetails='true': параметры запроса и заголовкибудет показано, что может привести к небезопасной регистрации потенциально
конфиденциальных данных
.339+03:00 INFO 26468 --- [http-nio-9191-exec-1] o.s.web.servlet .DispatcherServlet: завершена инициализация за
1 мс
.349+03:00 DEBUG 26468 --- [http-nio-9191-exec-1] o.s.w.f.CommonsRequestLoggingFilter: перед запросом [POST
/ api/ftp, headers=[content-length:"23", Accept-encoding:"gzip,
deflate, br", Accept:"/", user-agent:"Thunder Клиент
(https://www.thunderclient.com)", хост: "127.0.0.1:9191",
соединение: "закрыть", Content-Type:"application/json;charset=UTF -8"]]
.351+03:00 DEBUG 26468 --- [http-nio-9191-exec-1] o.s.web.servlet.DispatcherServlet : POST "/api/ftp",
параметры={}
.356+03:00 DEBUG 26468 --- [http-nio-9191-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping: сопоставлено с
com.demo.upload.controller.DocumentController#bssFtp (BVdFtp)
.399+03:00 DEBUG 26468 --- [http-nio-9191-exec-1] m.m.a.RequestResponseBodyMethodProcessor: прочитать
"application/json;charset=UTF-8" для[com.demo.upload.entity.BVdFtp@4d1d8432]
.417+03:00 INFO 26468 --- [http-nio-9191-exec-1] o.a.s.c.i.DefaultIoServiceFactoryFactory: Не обнаружено/настроеноIoServiceFactoryFactory; использование Nio2ServiceFactoryFactory
.566+03:00 DEBUG 26468 --- [http-nio-9191-exec-1] o.a.sshd.common.io.nio2.Nio2Connector : Подключение к
ftp.dbc-demo .com/44.241.60.17:22
.569+03:00 DEBUG 26468 --- [http-nio-9191-exec-1] o.a.sshd.common.io.nio2.Nio2Connector :
setOption (SO_REUSEADDR)[true] from
property=Property[socket-reuseaddr](Boolean]
.571+03:00 DEBUG 26468 --- [sshd-SshClient[2356aaa9]-nio2-resume-thread -1]
o.a.sshd.common.io.nio2.Nio2Connector :
connect(ftp.dbc-demo.com/44.241.60.17:22): ожидание соединения
(timeout=60000ms )
.613+03:00 DEBUG 26468 --- [sshd-SshClient[2356aaa9]-nio2-resume-thread-1]
org.apache.sshd.client.SshClient :
OperationComplete(demo@ftp.dbc-demo.com/44.241.60.17:22) не удалось
(ExecutionException): java.io.IOException: период ожидания семафора
истек
.614+ 03:00 ОШИБКА 26468 --- [http-nio-9191-exec-1] c.a.upload.service.SFTPUploadService: Не удалось выполнить
сеанс: Не удалось выполнить сеанс
Код: Выделить всё
org.springframework.messaging.MessagingException: Failed to execute on session
at org.springframework.integration.file.remote.RemoteFileTemplate.execute(RemoteFileTemplate.java:459)
на com.demo.upload.service.SFTPUploadService.uploadFile(SFTPUploadService.java: 29)
~[main/:na]
на com.demo.upload.controller.DocumentController.bssFtp(DocumentController.java:136)
~[main/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native
Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. java:77)
~[na:na]
на java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
~[na:na]at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod .java:255)
~[spring-web-6.1.11.jar:6.1.11]
в org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188)
~[spring-web-6.1.11.jar:6.1.11]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)~[spring-webmvc-6.1.11.jar:6.1.11]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)
~[spring-webmvc-6.1.11.jar:6.1.11]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)
~[spring-webmvc-6.1.11.jar:6.1.11]
в org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
~[ Spring-webmvc-6.1.11.jar:6.1.11]
в org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)
~[spring-webmvc-6.1.11 .jar:6.1.11]
в org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
~[spring-webmvc-6.1.11.jar:6.1.11]
в org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
~[spring-webmvc-6.1.11.jar:6.1.11]
в org. Springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)
~[spring-webmvc-6.1.11.jar:6.1.11]
в jakarta.servlet.http.HttpServlet.service (HttpServlet.java:590) ~[tomcat-embed-core-10.1.26.jar:10.1.26]
в org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
~[spring-webmvc-6.1.11.jar:6.1.11]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.26 .jar:10.1.26]
в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195)
~[tomcat-embed-core-10.1.26.jar:10.1. 26]
на org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
~[tomcat-embed-core-10.1.26.jar:10.1.26]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
~[tomcat-embed-websocket-10.1.26.jar:10.1.26]
at org .apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
~[tomcat-embed-core-10.1.26.jar:10.1.26]
в org.apache.catalina. core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
~[tomcat-embed-core-10.1.26.jar:10.1.26]
в org.springframework.web.filter.AbstractRequestLoggingFilter.doFilterInternal (AbstractRequestLoggingFilter.java:289)
~[spring-web-6.1.11.jar:6.1.11]
в org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
~[spring-web-6.1.11.jar:6.1.11]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
~[tomcat -embed-core-10.1.26.jar:10.1.26]
в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
~[tomcat-embed-core- 10.1.26.jar:10.1.26]
в org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
~[spring-web-6.1.11.jar:6.1 .11]
на org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
~[spring-web-6.1.11.jar:6.1.11]
в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
~[tomcat-embed-core-10.1.26.jar:10.1.26]
в org.apache. catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
~[tomcat-embed-core-10.1.26.jar:10.1.26]
в org.springframework.web.filter.FormContentFilter .doFilterInternal(FormContentFilter.java:93)
~[spring-web-6.1.11.jar:6.1.11]
в org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java: 116)
~[spring-web-6.1.11.jar:6.1.11]
в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
~ [tomcat-embed-core-10.1.26.jar:10.1.26]
в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
~[tomcat-embed- core-10.1.26.jar:10.1.26]
в org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
~[spring-web-6.1.11.jar :6.1.11]
на org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
~[spring-web-6.1.11.jar:6.1.11]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164)
~[tomcat-embed-core-10.1.26.jar:10.1.26]
at org. apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140)
~[tomcat-embed-core-10.1.26.jar:10.1.26]
в org.apache.catalina.core .StandardWrapperValve.invoke(StandardWrapperValve.java:167)
~[tomcat-embed-core-10.1.26.jar:10.1.26]
в org.apache.catalina.core.StandardContextValve.invoke( StandardContextValve.java:90)
~[tomcat-embed-core-10.1.26.jar:10.1.26]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483 )
~[tomcat-embed-core-10.1.26.jar:10.1.26]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)
~[tomcat-embed-core-10.1.26.jar:10.1.26]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
~[tomcat-embed -core-10.1.26.jar:10.1.26]
на org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
~[tomcat-embed-core-10.1. 26.jar:10.1.26]
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:663)
~[tomcat-embed-core-10.1.26.jar:10.1 .26]
на org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)
~[tomcat-embed-core-10.1.26.jar:10.1.26]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)
~[tomcat-embed-core-10.1.26.jar:10.1.26]
at org. apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
~[tomcat-embed-core-10.1.26.jar:10.1.26]
в org.apache.coyote.AbstractProtocol$ConnectionHandler .process(AbstractProtocol.java:904)
~[tomcat-embed-core-10.1.26.jar:10.1.26]
в org.apache.tomcat.util.net.NioEndpoint$SocketProcessor. doRun(NioEndpoint.java:1741)
~[tomcat-embed-core-10.1.26.jar:10.1.26]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase .java:52)
~[tomcat-embed-core-10.1.26.jar:10.1.26]
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java: 1190)
~[tomcat-embed-core-10.1.26.jar:10.1.26]
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659 )
~[tomcat-embed-core-10.1.26.jar:10.1.26]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
~[tomcat-embed-core-10.1.26.jar:10.1.26]
at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na ]
Вызвано: java.lang.IllegalStateException: не удалось создать сеанс SFTP
в org.springframework.integration.sftp.session.DefaultSftpSessionFactory.getSession(DefaultSftpSessionFactory.java:306)
~[ Spring-integration-sftp-6.3.2.jar:6.3.2]
at org.springframework.integration.sftp.session.DefaultSftpSessionFactory.getSession(DefaultSftpSessionFactory.java:82)
~[spring-integration -sftp-6.3.2.jar:6.3.2]
в org.springframework.integration.file.remote.RemoteFileTemplate.execute(RemoteFileTemplate.java:445)
~[spring-integration-file- 6.3.2.jar:6.3.2]
... Пропущено 57 общих фреймов
Причина: org.apache.sshd.common.SshException: DefaultConnectFuture[demo@ftp.dbc-demo.com/ 44.241.60.17:22]: Не удалось
(IOException) выполнить: период ожидания семафора истек
в org.apache.sshd.common.future.AbstractSshFuture.lambda$verifyResult$2(AbstractSshFuture.java: 146)
~[sshd-common-2.12.1.jar:2.12.1]
at org.apache.sshd.common.future.AbstractSshFuture.formatExceptionMessage(AbstractSshFuture.java:206)
~[sshd-common-2.12.1.jar:2.12.1]
at org.apache.sshd.common.future.AbstractSshFuture.verifyResult(AbstractSshFuture.java:145)
~[sshd- common-2.12.1.jar:2.12.1]
на org.apache.sshd.client.future.DefaultConnectFuture.verify(DefaultConnectFuture.java:55)
~[sshd-core-2.12.1 .jar:2.12.1]
в org.apache.sshd.client.future.DefaultConnectFuture.verify(DefaultConnectFuture.java:36)
~[sshd-core-2.12.1.jar:2.12. 1]
на org.apache.sshd.common.future.VerifyingFuture.verify(VerifyingFuture.java:110)
~[sshd-common-2.12.1.jar:2.12.1]
в org.apache.sshd.common.future.VerifyingFuture.verify(VerifyingFuture.java:96)
~[sshd-common-2.12.1.jar:2.12.1]
в org.springframework .integration.sftp.session.DefaultSftpSessionFactory.initClientSession(DefaultSftpSessionFactory.java:330)
~[spring-integration-sftp-6.3.2.jar:6.3.2]
в org.springframework.integration. sftp.session.DefaultSftpSessionFactory.getSession(DefaultSftpSessionFactory.java:296)
~[spring-integration-sftp-6.3.2.jar:6.3.2]
... 59 общих кадров опущены
Вызвано: java.io.IOException: период ожидания семафора истек
в java.base/sun.nio.ch.Iocp.translateErrorToIOException(Iocp.java:299)
~[na:na ]
at java.base/sun.nio.ch.Iocp$EventHandlerTask.run(Iocp.java:389) ~[na:na]
... 1 общий фрейм опущен
Код: Выделить всё
DEBUG 26468 --- [http-nio-9191-exec-1] o.s.w.s.m.m.a.HttpEntityMethodProcessor : Using 'text/plain', given
application/ +json]
DEBUG 26468 --- [http-nio-9191-exec-1] o.s.w.s.m.m.a.HttpEntityMethodProcessor : запись ["Не удалось загрузить
файл на SFTP-сервер"]
DEBUG 26468 -- - [http-nio-9191-exec-1] o.s.web.servlet.DispatcherServlet: завершено 202 ПРИНЯТО
ОТЛАДКА 26468 --- [http-nio-9191-exec-1] o.s.w.f.CommonsRequestLoggingFilter: ЗАПРОС ДАННЫХ: POST/api/ftp, headers=[content-length:"23", Accept-encoding: "gzip,
deflate, br", Accept:"/*", пользовательский агент: «Клиент Thunder
(https://www.thunderclient.com)», хост: «127.0.0.1:9191»,
соединение: «закрыть», Content-Type:»application/json;charset =UTF-8"],
payload={"filename":"0770.jpg"}]
Подробнее здесь: https://stackoverflow.com/questions/788 ... rough-sftp