Java의 FTP 서버에서 파일 업로드

  Apache Commons Net API를 사용하면 FTP 서버에서 파일을 다운로드하기 위한 프로그램을 쉽게 코딩할 수 있습니다. 이 기사에서는 FTP.

Apache Commons Net API 및 FTP

org.apache.commons.net.ftp.FTPClient은 FTP 서버에서 파일을 다운로드하는 두 가지 방법을 제공합니다.

1) boolean retrieveFile(String remote, OutputStream local): 이 메서드는 remote을 사용하고 OutputStream입니다. 이 메서드는 true, 그렇지 않으면 false입니다. 이 방법은 전송에 대한 정보와 파일이 디스크에 저장되는 방법을 알 필요가 없을 때 프로그램에 적합합니다. 다운로드가 끝나면 출력 스트림을 닫아야 합니다 OutputStream 다운로드 끝에 있습니다.

2) InputStream retrieveFileStream(String remote): 이 메서드는 원격 파일 경로만 매개변수로 사용하며 OutputStream이지만 InputStream 파일에서 수신한 바이트를 읽는 데 유용할 수 있습니다. 이 방법을 사용하면 바이트가 로컬 디스크에 기록되는 방식을 더 잘 제어할 수 있습니다. 이 방법을 사용하는 데는 두 가지 중요한 사항이 있습니다.
  • completePendingCommand()을 호출하여 다운로드를 완료하고 반환된 값을 확인하여 다운로드가 수행되었는지 확인해야 합니다.
  • 재생 스트림을 닫아야 합니다InputStream.
문제는 어떤 방법을 사용해야합니까? 다음은 몇 가지 트릭입니다 :
  • 첫 번째 방법은 OutputStream 디스크에 저장하려는 파일의
  • 두 번째 방법을 사용하면 전송 방법을 더 잘 제어할 수 있으므로 InputStream 수신된 바이트를 읽고 OutputStream   읽은 바이트를 저장합니다. 이 방법은 얼마나 많은 바이트가 전송되었고 얼마나 남았는지 알고 싶을 때 유용합니다. 방법  completePendingCommand()  호출해야 합니다  다운로드를 완료하려면
  • 두 메서드 모두 예외를 발생시킵니다 IOException 또는 다음 두 예외 : FTPConnectionClosedExcceptionCopyStreamException입니다. 따라서 .
를 호출할 때 이러한 예외를 올바르게 처리해야 합니다. 또한 methodsretrieveFile() 및  retrieveFileStream ()< / span > : < / div>

< / div>
- void enterLocalPassiveMode(): 이 방법은 연결 모드를 서버-클라이언트에서 클라이언트-서버로 변경하여 방화벽 금지 문제를 방지합니다.

- void setFileType(int fileType): 전송할 파일 유형을 변경하는 방법이므로 유형을 FTP로 변경하는 것이 좋습니다. FTP가 아닌 BINARY_FILE_TYPE. ASCII_FILE_TYPE 텍스트 파일일지라도 .

Java로 파일을 다운로드하는 단계

Apache Commons Net:
  • Connect 및 서버에 로그인합니다.
  • 수동 연결 모드 사용.
  • 전송 유형을 바이너리로 변경합니다.
  • outputStream 다운로드한 파일을 디스크에 저장합니다.
  • 디스크에 대한 기록 경로를 지정합니다.
  • retriveFile():
    • Pass outputStream 및 파일 경로를 인수로 사용합니다.
    • 닫기 쓰기 스트림  outputStream.
    • 다운로드가 성공했는지 확인하기 위해 반환된 값을 읽습니다.
  • retriveFileStream():
    • 검색 위치  InputStream  메서드에 의해 반환됨  retriveFileStream().
    • 바이트를 읽을 수 있는 설정된 크기(일반적으로 4096)의 바이트 배열(버퍼)을 만들고 a  outputStream.
    • completePendingCommand()을 사용하여 다운로드를 완료하고 반환된 값을 확인하여 전송이 성공했는지 확인합니다.
    • 읽기 및 쓰기 스트림 닫기 InputStreamoutputStream.
  • disconnect().

    Java에서 FTP를 사용하여 파일을 업로드하는 프로그램

    이 코드는 다음 두 가지 방법을 사용하여 FTP 서버에서 파일을 다운로드하는 방법을 보여줍니다.
    • 부울 retrieveFile(문자열 원격, InputStream 로컬)
    • inputStream retrieveFileStream (문자열 원격) < / span>< / li>< / ul>전체 코드는 다음과 같습니다 :

      import java.io.BufferedOutputStream; 
      import java.io.File;
      import java.io.FileInputStream;
      import java.io.FileOutputStream;
      import java.io.IOException;
      import java.io.InputStream을 사용합니다.
      import java.io.OutputStream;
      import org.apache.commons.net.ftp.FTP;
      import org.apache.commons.net.ftp.FTPClient;
      import org.apache.commons.net.ftp.FTPFile;

      public class FTPDownloadFile {

      public static void main(String[] args) {
      서버 문자열 = "ServerAddress";
      int 포트 = 21;
      문자열 사용자 이름 = "사용자 이름";
      문자열 비밀번호 = "yourPassword";

      FTPClient ftpClient = 새로운 FTPClient();
      {

      ftpClient.connect(서버, 포트);
      ftpClient.login(사용자 이름, 비밀번호);
      ftpClient.enterLocalPassiveMode();

      ftpClient.setFileType(FTP. BINARY_FILE_TYPE);

      // 접근법 1: InputStream File file = new File("plugins and styles.txt");

      String FileName = "플러그인 및 styles.txt";
      InputStream inputStream = new FileInputStream(file);

      System.out.println("다운로드 시작");
      //결과 다운로드
      boolean res = ftpClient.storeFile(filename, inputStream);
      //재생 스트림 닫기
      inputStream.close();

      if (res==true) {
      System.out.println(""+FileName+
      " 파일이 성공적으로 다운로드되었습니다.");
      }

      // 접근법 2: OutputStream String FileName2 = "Track 2.mp3";
      문자열 RemoteFilePath = "/songs/"+FileName2;
      파일 filelocal = new File("C:/track 2.mp3");

      // 파일이 있는 폴더를 나열하고
      // 그런 다음 얻을 이름으로 검색합니다
      // 계산에 사용할 크기
      // 다운로드의 비율
      FTPFile[] files1 = ftpClient.listFiles("/songs");
      긴 크기 = 0;
      for(int i = 0; 나는< 파일1.길이; i++){
      if(files1[i].getName().equals(FileName2))
      //파일 크기 가져오기
      size = files1[i].getSize();
      }

      OutputStream outputStream2 = new BufferedOutputStream(
      new FileOutputStream(로컬 파일));
      InputStream inputStream2 = ftpClient.retrieveFileStream(
      RemoteFilePath);

      byte[] bytesArray = 새 바이트[4096];
      int 바이트읽기 = -1;
      //끝에 도달하지 않는 한
      int transferred = 0;
      int 퍼센트 = 0;
      while ((bytesRead = inputStream2.read(bytesArray)) != -1) {
      //bytes는 지정된 위치에 기록됩니다
      outputStream2.write(bytesArray, 0, bytesRead);
      전달됨 += bytesRead;
      퍼센트 = (int) (전송됨*100/크기);
      System.out.println(백분율+"%");
      }
      //쓰기 읽기 스트림 닫기
      inputStream2.close();
      outputStream2.close();

      //br //
      res = ftpClient.completePendingCommand();
      if (res) {
      System.out.println(""+FileName2+
      " 파일이 성공적으로 다운로드되었습니다.");
      }

      } catch (IOException e) {
      System.out.println(e.getMessage());
      e.printStackTrace();
      } 마지막으로 {
      try {
      if (ftpClient.isConnected()) {
      //FTP
      ftpClient.logout();
      ftpClient.disconnect()를 호출합니다.
      }
      } catch (IOException ex) {
      ex.printStackTrace();
      }
      }
      }
      }
      이 코드를 실행하면 다운로드가 성공했음을 나타냅니다:

      다운로드 시작
      플러그인 및 styles.txt 파일이 성공적으로 다운로드되었습니다
      다운로드 시작
      1%
      2%
      3%
      .
      .
      98%
      99%
      99%
      100%
      2.mp3 트랙 파일이 성공적으로 다운로드되었습니다