powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring component для загрузки и скачивания файлов с sftp сервера
8 сообщений из 8, страница 1 из 1
Spring component для загрузки и скачивания файлов с sftp сервера
    #39893272
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Хочу поделиться этим кодом. Может будет кому интересно.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
import com.jcraft.jsch.*;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Properties;
import java.util.Vector;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Service
@Slf4j
public class SftpService {
    private static final int TEMP_DIR_ATTEMPTS = 10000;
    private final FtpOptions ftpOptions;

    SftpService(@Value("${sftp.host:''}") String host,
            @Value("${sftp.port:#{null}}") Integer port,
            @Value("${sftp.login:''}") String login,
            @Value("${sftp.password:''}") String password,
            @Value("${sftp.ftpPathFileName:''}") String ftpPathFileName) {
        this.ftpOptions = new FtpOptions()
                .setHost(host)
                .setPort(port)
                .setLogin(login)
                .setPassword(password)
                .setFtpPathFileName(ftpPathFileName);
    }

    public void uploadFileToSftp(List<File> files) throws Exception {
        uploadFileToSftp(files, ftpOptions);
    }

    public void uploadFileToSftp(List<File> files, FtpOptions ftpOptions) throws Exception {
        log.info("Upload files to SFTP server");
        ChannelSftp sftpChannel = createSftpChanel(ftpOptions.getLogin(), ftpOptions.getPassword(),
                ftpOptions.getHost(), ftpOptions.getPort());
        try {
            for (File file : files) {
                String remoteFileName = ftpOptions.getFtpPathFileName() + file.getName();

                log.info("Upload file: {} to {}", file.getName(), remoteFileName);

                sftpChannel.put(new FileInputStream(file), remoteFileName);
            }
        } finally {
            log.info("Close SFTP connection");
            sftpChannel.disconnect();
        }
    }

    public List<File> downloadFileFromSftp(String fileMask) throws Exception {
        return downloadFileFromSftp(fileMask, ftpOptions);
    }

    public List<File> downloadFileFromSftp(String fileMask, FtpOptions ftpOptions) throws Exception {
        log.info("Download files from SFTP server");
        ChannelSftp sftpChannel = createSftpChanel(ftpOptions.getLogin(), ftpOptions.getPassword(),
                ftpOptions.getHost(), ftpOptions.getPort());
        List<File> result = new ArrayList<>();
        try {
            Vector<ChannelSftp.LsEntry> lsEntries = sftpChannel.ls(
                    new StringBuilder(ftpOptions.getFtpPathFileName()).append("/").append(fileMask).toString());
            File myTempDir = createTempDir();
            // Iterating the list of entries to download the file(s) from the sftp
            for (ChannelSftp.LsEntry entry : lsEntries) {
                try {
                    // Downloading the specified file from the sftp to the specified folder path
                    String destFileName = new StringBuilder(myTempDir.getAbsolutePath()).append(File.separator)
                            .append(entry.getFilename()).toString();
                    sftpChannel.get(new StringBuilder(ftpOptions.getFtpPathFileName()).append("/")
                            .append(entry.getFilename()).toString(), destFileName);
                    result.add(new File(destFileName));
                } catch (SftpException sftpException) {
                    log.error("Failed to download the file the sftp folder location. {}", sftpException.getMessage());
                }                
            }
            // Iterating the list of entries to delete the file(s) from the sftp 
            for (ChannelSftp.LsEntry entry : lsEntries) {
                try {
                    // Deleting the specified file from the sftp
                    sftpChannel.rm(new StringBuilder(ftpOptions.getFtpPathFileName())
                            .append("/").append(entry.getFilename()).toString());
                } catch (SftpException sftpException) {
                    log.error("Failed to delete the file from the sftp folder location. {}", sftpException.getMessage());                    
                }                
            }
        } catch (SftpException ex) {
            log.error(ex.getMessage());
        } finally {
            log.info("Close SFTP connection");
            sftpChannel.disconnect();
        }
        return result;
    }
    
    private File createTempDir() {
        File baseDir = new File(System.getProperty("java.io.tmpdir"));
        String baseName = System.currentTimeMillis() + "-";

        for (int counter = 0; counter < TEMP_DIR_ATTEMPTS; counter++) {
          File tempDir = new File(baseDir, baseName + counter);
          if (tempDir.mkdir()) {
            return tempDir;
          }
        }
        throw new IllegalStateException("Failed to create directory within "
            + TEMP_DIR_ATTEMPTS + " attempts (tried "
            + baseName + "0 to " + baseName + (TEMP_DIR_ATTEMPTS - 1) + ')');
    }

    private ChannelSftp createSftpChanel(String sftpUser, String sftpPassword, String sftpHost, Integer sftpPort)
            throws JSchException {
        log.info("Connect to SFTP server: {} {} {} {}", new Object[]{
            sftpUser, sftpPassword, sftpHost, sftpPort
        });
        JSch jsch = new JSch();
        Session session = jsch.getSession(sftpUser, sftpHost, (Objects.isNull(sftpPort) ? 22 : sftpPort));

        session.setPassword(sftpPassword);
        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");
        session.setConfig(config);
        session.connect();
        Channel channel = session.openChannel("sftp");
        channel.connect();
        return (ChannelSftp) channel;
    }

    public FtpOptions getFtpOptions() {
        return ftpOptions;
    }
}



Юнит тест:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Collections;
import java.util.List;
import static org.hamcrest.Matchers.hasSize;
import static org.junit.Assert.*;
import org.junit.Test;

public class SftpServiceTest {
    
    @Test
    public void uploadAndDownloadFileToSftp() throws Exception {
        SftpService sftpService = new SftpService("host",
            22, "login", "password", "/");
        File newFile = Files.write(Paths.get("./test.csv"), "data".getBytes(StandardCharsets.UTF_8)).toFile();
        sftpService.uploadFileToSftp(Collections.singletonList(newFile));
        List<File> files = sftpService.downloadFileFromSftp("test.csv", sftpService.getFtpOptions());
        assertThat(files, hasSize(1));
        files.get(0).deleteOnExit();
    }
}



С уважением, Валентин
...
Рейтинг: 0 / 0
Spring component для загрузки и скачивания файлов с sftp сервера
    #39893274
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;

@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
@Getter
@Setter
public class FtpOptions {
    String host;
    Integer port;
    String login;
    String password;
    String ftpPathFileName;
}



Ещё этот файл.
...
Рейтинг: 0 / 0
Spring component для загрузки и скачивания файлов с sftp сервера
    #39893291
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin Kolesnikov,

ты бы хоть описал преимущества и прочее
...
Рейтинг: 0 / 0
Spring component для загрузки и скачивания файлов с sftp сервера
    #39893680
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin Kolesnikov, зачем?

Spring Integration SFTP Adapters
...
Рейтинг: 0 / 0
Spring component для загрузки и скачивания файлов с sftp сервера
    #39893683
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalov
Valentin Kolesnikov, зачем?

Spring Integration SFTP Adapters


Мой класс работает без spring integration.

Хорошего вам дня!
...
Рейтинг: 0 / 0
Spring component для загрузки и скачивания файлов с sftp сервера
    #39893684
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя
Valentin Kolesnikov,

ты бы хоть описал преимущества и прочее


Не понял вопрос. Можете перефразировать его пожалуйста.

Хорошего вам дня!
...
Рейтинг: 0 / 0
Spring component для загрузки и скачивания файлов с sftp сервера
    #39893685
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valentin Kolesnikov
Не понял вопрос. Можете перефразировать его пожалуйста.
в чем преимущества этого кода?
может он и будет полезен а может быть и нет.. есть ли смысл вникать в него?
задлянафига копаться в чужом коде , однако?
...
Рейтинг: 0 / 0
Spring component для загрузки и скачивания файлов с sftp сервера
    #39893688
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя
Valentin Kolesnikov
Не понял вопрос. Можете перефразировать его пожалуйста.
в чем преимущества этого кода?
может он и будет полезен а может быть и нет.. есть ли смысл вникать в него?
задлянафига копаться в чужом коде , однако?


Я использовал его для скачивания файлов с sftp сервера. Можно подключить его как отдельный сервис и использовать в коде.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring component для загрузки и скачивания файлов с sftp сервера
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]