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);
}
}