FTP 서버 간 파일 이동(node.js)

Singsoong·2022년 7월 13일
1

nodejs

목록 보기
1/3

먼저, FTP 서버를 만든다.

📌FTP 서버 만들기

  • FTP 서버는 윈도우 자체에서 만들수도 있으나, FileZilla를 이용해보았다.
  • FileZilla Server를 설치한 후 Adminstration interface 프로그램을 접속한다.
  • 상단의 Server > Configure > Server listeners 항목을 선택한다.
  • cmd에서 ipconfig 명령어를 입력하여 자신의 IPv4 주소를 확인한 후 Address에 적고 추가한다.
  • Users 항목에서 user를 추가하고 이름을 설정하고 필요시 (추천) 비밀번호를 설정한다. 서버내에서 사용할 Virtual path를 설정한다. (나같은 경우는 /Test), 그리고 Native Path를 설정하는데 자신의 로컬에 저장될 폴더를 만든 후 그 주소를 입력하면 된다. (나같은 경우에는 바탕화면에 Test 폴더를 만들었으므로 C:\Users\이름\Desktop\Test)
  • 이렇게 설정하면 만든 FTP 서버로 업로드하게되면 \Desktop\Test 폴더에 업로드한 파일이 저장되게 된다.

    FTP 서버 간 파일 이동을 테스트하려면 FTP 서버가 두개 필요한데, 한개는 파일질라로 만들었고 한개는 팀장님께서 테스트하라고 할당해주셨다.


📌무엇을 구현해야 하지?

  • npm 라이브러리 중, basic-ftp 를 사용해 구현하였다.
  • 서버 간 파일을 이동하려면 크게 3가지 과정이 필요했다.
    1) FTP 서버에서 download 받기
    2) download 받은 파일을 다른 FTP 서버로 upload 하기
    3) 받은 파일을 local(혹은 서버)에서 지우기

📌Download

  • FTP 서버에서 특정파일을 다운받아야 한다.
  • 먼저, 다운받을 파일을 서버에 업로드 해두었다. (파일질라 client를 이용)
/* basic-ftp 라이브러리를 가져온다 이후에는 생략하겠음 */
const ftp = require("basic-ftp");
async function download(){
	const client = new ftp.Client();
  	client.ftp.verbose = true; // 자세한 통신과정을 보고 싶으면 true, 생략하고 싶으면 false로 설정하면 된다.
  	try{
      await client.access({
        host: "다운로드 받을 FTP 주소",
      	user: "FTP에 접속하기 위해 만들었던 user 이름",
        password: "FTP에 접속하기 위해 만들었던 user password", // type: string!!
      });
      await client.cd("/Test"); // 서버에 접속 후 서버에 만들어둔 Test 폴더로 이동
      await client.downloadTo("test.txt", "test.txt"); // 첫번째 인자는 저장할 때 어떤 이름으로 저장할것인지, 두번째 인자는 가져올 파일
    } catch (err){
      console.log(err);
      client.close();
      return false;
    }
  
  	client.close();
  	return true;
}
  • 다운로드 받을 FTP 주소에 접속해서 Test 폴더에 있는 test.txt 파일을 test.txt파일 명으로 download 한다.

📌Upload

  • 다운받은 test.txt파일을 다른 FTP 서버로 upload하려 한다.
async function upload() {
  const client = new ftp.Client();
  client.ftp.verbose = true; // 통신 상세 과정 볼거면 true, 아니면 false

  try {
    await client.access({
      host: "업로드 FTP 주소",
      user: "FTP에 접속하기 위해 만들었던 user 이름",
      password: "FTP에 접속하기 위해 만들었던 user password", // type: string!!
    });
    await client.cd("/Server"); // 서버에 접속 후, 업로드할 폴더로 이동
    await client.uploadFrom(
      "어떤이름으로 업로드?",
      "어떤 파일 가져올것?"
    );
  } catch (err) {
    console.log(err);
    client.close();
    return false;
  }

  client.close();
  return true;
}
  • 다운로드, 업로드 과정을 거치면 파일의 이동은 잘되었다.
  • 하지만, 로컬(혹은 서버)에 남은 파일을 지우는 작업이 필요하다.

📌Delete File

  • 파일 지우는 것은 간단하다. 지울 파일의 경로만 주면 된다.
const deleteFile = () => {
  fs.unlinkSync(
    "지울 파일의 경로"
  );
};

📌결론

  • 이 세가지 과정을 비동기 처리해야 한다. (async, await 이용)
	/* 대충 이런식으로... */
	function test = async() => {
      const downloadingFlag = await download();
      const uploadingFlag = await upload();
      deleteFile();
    }
  • 이후 개선해야 할 사항
    1) 호스트 정보가 하드코딩 되어있다. txt 파일 혹은 js 파일에 호스트 정보를 적어두면 값을 넣게끔 구현해야 한다.
    2) 특정 파일만을 가져오는 것이 아닌, 서버에 있는 폴더를 포함한 파일들을 모두 가져올 수 있게 구현해야 한다. (Source와 Destination host 정보만 넣으면 Source->Destination으로 모든 폴더가 전송되게끔 구현)
profile
Frontend Developer

0개의 댓글