C#

FTP 파일전송

FTP (File Transfer Protocol)

FTP는 File Transfer Protocol의 약자로서, 클라이언트와 서버 간의 파일을 전송/교환하는데 사용한다. FTP 서버에 접속하기 위해서 FTP 사용자명과 암호를 사용하거나, 서버가 익명사용자(Anonymous)를 허용할 수 경우 익명으로 FTP 서버에 접속할 수도 있다.

FTP 보다 더 안전한 방식의 파일 전송 프로토콜로서 SFTP가 있는데, FTP는 디폴트로 포트 21을 사용하고, SFTP는 SSH 포트(디폴트로 22)를 기본적으로 사용한다. 일반적으로 보안상 FTP 보다는 SFTP를 사용할 것을 권장한다.

WebClient를 사용하여 FTP 사용하기

C#에서 FTP를 사용하기 위해서는 여러 방법이 있는데, 간단하게는 System.Net.WebClient 클래스를 사용할 수 있으며, 좀 더 세밀한 제어를 위해서는 System.Net.FtpWebRequest 클래스를 사용할 수 있다. 아래는 WebClient 클래스를 사용하여 파일을 업로드하는 예제이다. FTP 파일 업로드를 위해서는 WebClient.UploadFile(혹은 UploadFileAsync) 메서드를 사용하고, 다운로드를 위해서는 WebClient.DownloadFile(혹은 DownloadFileAsync) 메서드를 사용한다. (주: 여기서 ftp.dlptest.com 사이트는 FTP 테스트를 위한 온라인 사이트로서 현재 사용 가능하지만, 차후 사용 불가능할 수도 있다)

// using System.Net;

string user = "dlpuser@dlptest.com";
string pwd = "bbCKucPzfr4b9YXUY7tvsNKyh";

// FTP 업로드
using (var client = new WebClient())
{
    client.Credentials = new NetworkCredential(user, pwd);
    client.UploadFile("ftp://ftp.dlptest.com/test1.dat", @"C:\Temp\test.dat");
}

// FTP 다운로드
using (var client = new WebClient())
{
    client.Credentials = new NetworkCredential(user, pwd);
    client.DownloadFile("ftp://ftp.dlptest.com/test1.dat", @"C:\Temp\testdn.dat");
}

FtpWebRequest를 사용하여 FTP 사용하기

C#에서 좀 더 세밀한 FTP를 제어할 필요가 있을 때는, System.Net.FtpWebRequest 클래스를 사용할 수 있다. 예를 들어, FtpWebRequest.EnableSsl 속성을 사용하여 TLS/SSL을 enable 한다거나, FtpWebRequest.UsePassive 속성을 false로 설정하여 FTP를 Active 모드로 설정하거나, FtpWebRequest.UseBinary 속성을 false로 하여 사용하여 (디폴트인) 바이너리 모드가 아닌 ASCII 모드로 데이타를 전송하는 등등의 여러 제어를 설정할 수 있다. 아래는 FtpWebRequest 클래스를 사용하여 파일을 업로드하는 예제이다. FtpWebRequest 객체는 WebRequest.Create() 메서드를 사용하여 생성하고 이를 FtpWebRequest 타입으로 캐스팅하여 객체를 얻는다. FTP 사용자는 FtpWebRequest.Credentials 에 지정하고, FTP에서 사용할 명령어를 FtpWebRequest.Method 에 지정한다. 예를 들어, Method 속성은 업로드를 위해 WebRequestMethods.Ftp.UploadFile, 다운로드를 위해 WebRequestMethods.Ftp.DownloadFile 을 지정한다. 한가지 주목할 점은 FTP 업로드시 서버 URL에서 서버명과 함께 파일 경로를 같이 지정해 주어야 한다는 점이다. 즉, ftp://ftp.dlptest.com 대신 ftp://ftp.dlptest.com/test2.dat 와 같이 업로드할 경로와 파일명을 함께 지정해 주어야 한다.

// using System;
// using System.IO;
// using System.Net;

string user = "dlpuser@dlptest.com";
string pwd = "bbCKucPzfr4b9YXUY7tvsNKyh";

// FTP 서버에 일반 계정 사용하여 업로드
FtpWebRequest req = (FtpWebRequest)WebRequest.Create("ftp://ftp.dlptest.com/test2.dat");
req.Credentials = new NetworkCredential(user, pwd);
// req.EnableSsl = true; // TLS/SSL enable
req.UseBinary = false;   // ASCII 모드 (디폴트는 Binary 모드임)
req.Method = WebRequestMethods.Ftp.UploadFile;

// 파일 업로드
byte[] data = File.ReadAllBytes(@"C:\Temp\test.dat");
using (var ftpStream = req.GetRequestStream())
{
    ftpStream.Write(data, 0, data.Length);
}

// 응답 표시
using (var resp = (FtpWebResponse)req.GetResponse())
{
    Console.WriteLine(resp.StatusDescription);
}

아래는 FTP 다운로드를 위한 예제로서, 전체적인 코딩 구조는 위의 업로드 예제와 비슷한데, 다운로드를 위해 FtpWebRequest.Method를 WebRequestMethods.Ftp.DownloadFile으로 지정하고, 업로드에서 사용된 GetRequestStream() 대신 req.GetResponse().GetResponseStream() 를 사용하여 다운로드되는 스트림을 가져와서 파일로 저장하게 된다.

// using System;
// using System.IO;
// using System.Net;

string user = "dlpuser@dlptest.com";
string pwd = "bbCKucPzfr4b9YXUY7tvsNKyh";

// FTP 서버에 일반 계정 사용하여 다운로드
FtpWebRequest req = (FtpWebRequest)WebRequest.Create("ftp://ftp.dlptest.com/test.dat");
req.Credentials = new NetworkCredential(user, pwd);
req.Method = WebRequestMethods.Ftp.DownloadFile;

// 파일 다운로드
using (var localfile = File.Open(@"C:\Temp\local.dat", FileMode.Create))
using (var ftpStream = req.GetResponse().GetResponseStream())
{
    byte[] buffer = new byte[1024];
    int n;
    while ((n = ftpStream.Read(buffer, 0, buffer.Length)) > 0)
    {
        localfile.Write(buffer, 0, n);
    }
}

본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.

Previous Next Print