개발자의 끄적끄적

[spring] SPRING을 이용한 SFTP 파일 업로드[펌] 본문

개발/java & jsp

[spring] SPRING을 이용한 SFTP 파일 업로드[펌]

효벨 2020. 1. 22. 01:00
728x90
반응형

[spring] SPRING을 이용한 SFTP 파일 업로드[펌]

 

본격 코드를 작성은 하지만.. 예문식으로 작성을 하겠다.

자세한 코드 설명은.. 구글이나 블로그들에 있을테고.. 여기선 어떻게 사용하는지만 보자.

설명을 하기 위해 코드를 최대한 나름 짧게 작성해 보았다.

 

일단 메인 form에서 버튼을 만들어준다음, onclick 으로 /upload/connectFtp 를 호출해주자.

그럼 아래에 만들어 놓은 컨트롤러의 /upload/connectFtp 가 호출이 되면서 시작이 된다.

 

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

@Controller

public class FtpController {

  

   protected static String FTP_IP   = "192.168.0.53"// FTP 접속지 IP

   protected static int    FTP_PORT = 22;             // FTP 접속지 Port

   protected static String FTP_ID   = "gipsy";        // ID

   protected static String FTP_PWD  = "gipsy";        // PASSWORD

   protected static String FTP_PATH = "";

   ChannelSftp chSftp               = null;

   FileInputStream fi               = null;

     

   /**

    * FTP 방식으로 연결

    */

   @RequestMapping(value = "/upload/connectFtp", method=RequestMethod.GET)

   public String connectFtp() {

     

      // FTP 관련 객체 선언

      Session ses = null;             // 접속계정

      Channel ch  = null;             // 접속

      JSch jsch   = new JSch();       // jsch 객체를 생성

     

      try {

         // 세션 객체를 생성(사용자 이름, 접속할 호스트, 포트)

         ses = jsch.getSession(FTP_ID, FTP_IP, FTP_PORT);

         

         // 비밀번호 설정

         ses.setPassword(FTP_PWD);

         

         // 세션과 관련된 정보를 설정

         Properties p = new Properties();

        

         // 호스트 정보를 검사하지 않음

         p.put("StrictHostKeyChecking""no");

         ses.setConfig(p);

        

         System.out.println("연결중");

         

         // 접속

         ses.connect();        

 

         // 채널을 오픈(sftp)

         ch = ses.openChannel("sftp");

         

         // 채널에 연결(sftp)        

         ch.connect();        

           

         // 채널을 FTP용 채널 객체로 개스팅

         chSftp = (ChannelSftp)ch;     

        

         System.out.println("FTP 연결이 되었습니다.");

      } catch(Exception e) {

         e.printStackTrace();

         System.out.println("FTP 연결에 실패했습니다.");

         return "redirect:/upload/uploadForm";

      }

      return "/upload/ftpConnect";

   }

 

   @RequestMapping(value = "/upload/disconnectFtp", method=RequestMethod.GET)

   public String disconnectFtp() {

     

      try {

         chSftp.quit();                            // Sftp 연결 종료

         System.out.println("FTP 연결을 종료합니다.");

      } catch(Exception e) { 

         System.err.println(e.getMessage());

      }

  

      return "redirect:/upload/uploadForm";

   }

  

   @RequestMapping(value = "/upload/uploadFtp", method=RequestMethod.GET)

   public String uploadFtp() {

     

      String filePath = "D:/SFTP.txt";     // 나중에 DB에서 필요한 경로 당기면 good

      

      File file= new File(filePath);       // file 객체 생성 (파일 경로 입력)

      try {

         fi = new FileInputStream(file);

         chSftp.cd("/");                   // 서버의 경로

         chSftp.put(fi, file.getName());   // 서버에 파일 보내기

      } catch(SftpException e) { 

         e.printStackTrace();

      } catch(FileNotFoundException e) {

         e.printStackTrace();

      } finally {

         try {

            fi.close();

         } catch (IOException e) {

            e.printStackTrace();

         }

      }

      return "redirect:/upload/uploadForm";

   }  

  

}

Colored by Color Scripter

cs

 

메인폼에서 /upload/connectFtp 를 호출하면, controller 단에 있는 connectFtp 메서드가 호출이된다.

 

여기서 필요한 객체들을 생성을 하고, 특히 Session, Channel, Channel, JSch 와 같은 객체들은

이전 포스트에서 추가한 jsch-0.1.50.jar 라이브러리에서 임포트가 된다.

 

먼저 SFTP 연결부터 보자. 

 

생성된 세션 객체에 사용자 이름, 접속할 호스트(아이피), 포트 등을 넣어주고 비밀번호도 설정해준다.

 

세션과 관련된 정보, 호스트 정보 검사 안함 등의 부분이 있는데.. 사실 이부분은 공부를 좀 해야할듯 싶다.. 일부러 주석 처리를 해보니..

UnknownHostKey: 192.168.0.53. RSA key fingerprint is 

이러면서 오류 길게도 뜬다.. 일단.. 적자.. 나중에 필요하면 포스팅을;;

 

그리고 세션을 연결을 하고, 연결이 되면 sftp 채널을 연다. 그리고 채널 접속.

(연결이 안될 경우, 강제로 메인폼으로 보내도록 설정했다)

SFTP 접속이 완료되었다!

 

서버쪽에서 Online users 항목을 보면 아래와 같이 떠준다. 접속이 잘 된것이 확인된다.

 

이게 다 JSch 라이브러리 덕분에 이리 쉽게 되는거다. 찬양하자. ' ㅅ')/

 

접속이 완료되면 /upload/ftpConnect 페이지로 리턴을 해준다.

ftpConnect.jpg 페이지에는 연결 끊기와, 파일업로드 버튼을 각각 만들어주자.

둘다 마찬가지로 input button onclick을 이용한 get방식을 이용하면 참으로 편리하다.

 

 

다음은 /upload/disconnectFtp 부터 하자. 이름부터 접속을 끊는 페이지 호출이다.

이 메서드는 내용이 별게 없다.. ChannelSftp 를 quit() 해주면 끝이란다. chSftp.quit();

실행해보면, 서버쪽의 Online users 에서 접속했던 사용자 gipsy가 사라지는 것을 볼 수 있다.

그리고 화면은 다시 메인폼으로 redirect 로 보내준다. (주소입력창 good / 새로고침시 good)

 

 

마지막으로 파일업로드 부분이다.

/upload/uploadFtp 을 호출하여 메서드가 작동이 되며, 설명을 간단하게 하기 위해, 이전 포스트에서 만들어 놓은 간단한 경로의 파일을 보내도록 하기 위해 filePath 를 설정했다.

주석에도 적혀있지만, 나중에 DB랑 연동을 하면 좀 더 고급스럽게 사용할 수 있다.

 

그 다음은 생각보다 간단하다. FILE 객체를 생성하면서 파일 경로를 넣어주고,

그것을 FileInputStream 클래스로 바이트 데이터를 읽어들이고,

ChannelSftp.cd() / chSftp.cd() 를 사용하여 서버쪽 경로 설정.

ChannelSftp.put() / chSftp.put() 을 이용해, 파일을 보낸다.

 

실제로 확인해 보면, 서버쪽의 폴더 내에 SFTP.txt 파일이 들어가 있는 것을 볼 수 있다!

 

출처 : http://blog.naver.com/PostView.nhn?blogId=racoon_z&logNo=220688666853

반응형
Comments