본문 바로가기

😱 문제원인

FTP로 파일을 전송할 때 파일 사이즈가 커지는 문제가 발생했다.

같은 파일인데 파일 사이즈가 커지는 부분이 문제 되었다. (파일 사이즈를 비교하여 동작하는 기능이 있기 때문이다.)

 

참고로 아래 라이브러리를 사용하여 FTP, FTPS, SFTP 기능을 구현했다.

<dependency>
   <groupId>commons-net</groupId>
   <artifactId>commons-net</artifactId>
   <version>3.11.1</version>
</dependency>

<dependency>
   <groupId>com.jcraft</groupId>
   <artifactId>jsch</artifactId>
   <version>0.1.55</version>
</dependency>

 

 

😊 해결방법

FTP 설정 문제임을 파악하여 FTP 접속 시 조건을 변경했다.

바이너리 모드로 설정해야 파일 사이즈가 그대로 간다고 한다. 

옵션에 대한 자세한 설명은 아래에 작성했다.

 if(ftp.login(user, pass)) {
    ftp.setFileType(FTPClient.BINARY_FILE_TYPE); // 바이너리 모드 설정
    ftp.setFileTransferMode(FTPClient.STREAM_TRANSFER_MODE); // 스트림 모드 설정
    ftp.setFileStructure(FTPClient.FILE_STRUCTURE); // 파일 구조 설정

    log.info("Passive mode set: " + ftp.getReplyString());
    log.info("Binary file type set: " + ftp.sendCommand("TYPE I"));
    log.info("File transfer mode set: " + ftp.getReplyString());
    log.info("File structure set: " + ftp.getReplyString());
} else {
    throw new Exception("login error");
}

 

 

💡설정한 옵션에 대한 정리

File Type (파일 유형 설정)

설명

: 파일을 전송할 때의 형식을 지정합니다. 주로 텍스트 파일과 바이너리 파일 간의 구분이 필요합니다.

 

옵션

  1. FTP.ASCII_FILE_TYPE (기본값):
    • 텍스트 파일(예: .txt, .csv) 전송에 적합.
    • 클라이언트와 서버 간에 텍스트 형식을 변환(줄 바꿈 등)하며 전송합니다.
    • 주의: 바이너리 파일 전송 시 데이터 손상 가능.
  2. FTP.BINARY_FILE_TYPE:
    • 바이너리 파일(예: .png, .zip, .mp4) 전송에 적합.
    • 데이터가 원본 그대로 전송됩니다.
    • 텍스트 변환 없음.
    • 일반적으로 파일 손상 방지를 위해 가장 자주 사용.
  3. FTP.EBCDIC_FILE_TYPE:
    • IBM 메인프레임과 같이 EBCDIC(Extended Binary Coded Decimal Interchange Code) 형식을 사용하는 시스템과의 통신에 사용.
    • 일반적으로 잘 사용하지 않음.

 

File Transfer Mode (파일 전송 모드 설정)

설명

: 데이터를 전송할 때 사용하는 전송 방법을 지정합니다.

 

옵션

  1. FTP.STREAM_TRANSFER_MODE (기본값):
    • 데이터를 스트림(연속적인 흐름)으로 전송합니다.
    • 대부분의 상황에서 기본으로 사용.
    • 전송 중 데이터가 손실되거나 중단되면 재전송이 어려움.
  2. FTP.BLOCK_TRANSFER_MODE:
    • 데이터를 블록 단위로 전송합니다.
    • 각 블록에 헤더가 포함되어 있어 손실되었을 때 복구가 가능.
    • 속도가 느릴 수 있으므로 일반적으로 사용하지 않음.
  3. FTP.COMPRESSED_TRANSFER_MODE:
    • 데이터를 전송하기 전에 압축하여 전송.
    • 네트워크 대역폭을 절약할 수 있음.
    • 서버와 클라이언트가 모두 압축 전송을 지원해야 사용 가능.

 

File Structure (파일 구조 설정)

설명

: 서버가 파일을 어떻게 관리하고 구조화하는지에 대한 정보를 설정합니다.

 

옵션

  1. FTP.FILE_STRUCTURE (기본값):
    • 파일이 연속적인 바이트 스트림으로 구성되어 있음을 나타냅니다.
    • 대부분의 일반적인 파일 전송에서 사용.
  2. FTP.RECORD_STRUCTURE:
    • 파일이 레코드 단위로 구성된 경우 사용합니다.
    • 예: 메인프레임 시스템에서 레코드 기반 파일 전송 시.
  3. FTP.PAGE_STRUCTURE:
    • 파일이 페이지 단위로 나뉘어 저장되고 전송될 때 사용.
    • 거의 사용되지 않음.

🌻참고

https://stackoverflow.com/questions/55078798/increased-file-size-after-sending-to-ftp-using-apache-commons-net

개발의 각궁

Spring | Spring MVC | Spring Boot | Spring Security | Mysql | Oracle | PostgreSQL | Mybatis | JPA | Angular.js | Vue.js | Nuxt.js | React.js | TypeScript | JSP | Frontend | Backend