Upload File Bằng phương thức FTP trong C#

Chào các bạn.

Upload file bằng phương thức FTP là một phương thức upload cơ bản và nó có rủi ro là nếu bạn bị dùng đường truyền internet bình thường sẽ có thể bị ăn cắp dữ liệu và để khắc phục điều này người ta dùng một phương thức phức tạp hơn là FPTS hay là SFTP.

Nhưng trong bài viết này mình trình bày vấn đề upload cơ bản để chúng ta tìm hiểu về cách thức đưa dữ liệu lên server từ client như thế nào nhé.

Đầu tiên cần: host, user, pass để có thể truy cập vào server nhé.

private string host = null;
private string user = null;
private string pass = null;

Chúng ta cần một cái FtpWebRequest để gửi Request lên, tiếp theo là FtpWebResponse để nhận Response từ server về và cuối cùng là một Stream để như một cái ống nối vô hình từ Server với Client để truyền dữ liệu qua lại giữa 2 bạn này với nhau. Chúng ta khai báo như sau:

private FtpWebRequest ftpRequest = null;
private FtpWebResponse ftpResponse = null;
private Stream ftpStream = null;

Chúng ta khởi tạo nhé:

public Ftp(string hostIP, string userName, string password)

{

host = hostIP;

user = userName;

pass = password;

}

+ Hàm Download như sau:

/* Download File */
public bool download(string remoteFile, string localFile)
{
bool isDownloadSuccessful = false;
try
{
int bufferSize = this.getFileSize(remoteFile);
/* Create an FTP Request */
ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + “/” + remoteFile);
/* Log in to the FTP Server with the User Name and Password Provided */
ftpRequest.Credentials = new NetworkCredential(user, pass);
/* When in doubt, use these options */
ftpRequest.UseBinary = true;
ftpRequest.UsePassive = true;
ftpRequest.KeepAlive = true;
/* Specify the Type of FTP Request */
ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile;
/* Establish Return Communication with the FTP Server */
ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
/* Get the FTP Server’s Response Stream */
ftpStream = ftpResponse.GetResponseStream();
/* Open a File Stream to Write the Downloaded File */
FileStream localFileStream = new FileStream(localFile, FileMode.Create);
/* Buffer for the Downloaded Data */

byte[] byteBuffer = new byte[bufferSize];
int bytesRead = ftpStream.Read(byteBuffer, 0, bufferSize);
/* Download the File by Writing the Buffered Data Until the Transfer is Complete */
try
{
while (bytesRead > 0)
{
localFileStream.Write(byteBuffer, 0, bytesRead);
bytesRead = ftpStream.Read(byteBuffer, 0, bufferSize);
}
isDownloadSuccessful = true;
}
catch (Exception ex) { Console.WriteLine(ex.ToString()); }
/* Resource Cleanup */
localFileStream.Close();
ftpStream.Close();
ftpResponse.Close();
ftpRequest = null;
}
catch (Exception ex) { Console.WriteLine(ex.ToString()); }
return isDownloadSuccessful;
}

+ Upload:

/* Upload File */

public bool doUpload(string remoteFileName, string localPathFile)
{
bool iSuccessful = false;
try
{
/*Get Local File Information*/
FileInfo objLocalFile = new FileInfo(localPathFile);

/* Create an FTP Request */
ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + “/” + remoteFileName);
/* Log in to the FTP Server with the User Name and Password Provided */
ftpRequest.Credentials = new NetworkCredential(user, pass);
/* When in doubt, use these options */
ftpRequest.UseBinary = true;
ftpRequest.UsePassive = true;
ftpRequest.KeepAlive = true;
//ftpRequest.Timeout = 1000;
//set Time out for request upload
ftpRequest.Timeout = 600000 * 3;
ftpRequest.ContentLength = objLocalFile.Length;
/* Specify the Type of FTP Request */
ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
/* Establish Return Communication with the FTP Server */
ftpStream = ftpRequest.GetRequestStream();
/* Open a File Stream to Read the File for Upload */
//FileStream remoteFileStream = new FileStream(remoteFile, FileMode.Create);
FileStream remoteFileStream = objLocalFile.OpenRead();

/* Buffer for the Uploaded Data */
int bufferSize = (int)remoteFileStream.Length;
byte[] byteBuffer = new byte[bufferSize];
int bytesSent = remoteFileStream.Read(byteBuffer, 0, bufferSize);
/* Upload the File by Sending the Buffered Data Until the Transfer is Complete */
try
{
while (bytesSent != 0)
{
ftpStream.Write(byteBuffer, 0, bytesSent);
bytesSent = remoteFileStream.Read(byteBuffer, 0, bufferSize);
}
iSuccessful = true;
}
catch (Exception ex)
{
messageUploadFile = ex.Message.ToString();
MessageBox.Show(ex.Message.ToString());
//Console.WriteLine(ex.ToString());
}
/* Resource Cleanup */
remoteFileStream.Close();
ftpStream.Close();
ftpRequest = null;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
return iSuccessful;
}

+ Delete File như sau:

/* Delete File */
public bool delete(string deleteFile)
{
bool isDeleted = false;
try
{
/* Create an FTP Request */
ftpRequest = (FtpWebRequest)WebRequest.Create(host + “/” + deleteFile);
/* Log in to the FTP Server with the User Name and Password Provided */
ftpRequest.Credentials = new NetworkCredential(user, pass);
/* When in doubt, use these options */
ftpRequest.UseBinary = true;
ftpRequest.UsePassive = true;
ftpRequest.KeepAlive = true;
/* Specify the Type of FTP Request */
ftpRequest.Method = WebRequestMethods.Ftp.DeleteFile;
/* Establish Return Communication with the FTP Server */
ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
/* Resource Cleanup */
ftpResponse.Close();
ftpRequest = null;
isDeleted = true;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
return isDeleted;

}

/* Rename File */
public void rename(string currentFileNameAndPath, string newFileName)
{
try
{
/* Create an FTP Request */
ftpRequest = (FtpWebRequest)WebRequest.Create(host + “/” + currentFileNameAndPath);
/* Log in to the FTP Server with the User Name and Password Provided */
ftpRequest.Credentials = new NetworkCredential(user, pass);
/* When in doubt, use these options */
ftpRequest.UseBinary = true;
ftpRequest.UsePassive = true;
ftpRequest.KeepAlive = true;
/* Specify the Type of FTP Request */
ftpRequest.Method = WebRequestMethods.Ftp.Rename;
/* Rename the File */
ftpRequest.RenameTo = newFileName;
/* Establish Return Communication with the FTP Server */
ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
/* Resource Cleanup */
ftpResponse.Close();
ftpRequest = null;
}
catch (Exception ex) { Console.WriteLine(ex.ToString()); }
return;
}

Và giờ là hàm lấy size của File, nếu không có Hàm này thì khi upload và download bạn có thể sẽ không đưa được hết dữ liệu tới nơi vì nếu cái thùng của bạn bé quá sẽ không đựng được hết dữ liệu hoặc lớn quá sẽ thừa thãi.

/* Get the Size of a File */
public int getFileSize(string fileName)
{
int fileSize = 0;
try
{
/* Create an FTP Request */
ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + “/” + fileName);
/* Log in to the FTP Server with the User Name and Password Provided */
ftpRequest.Credentials = new NetworkCredential(user, pass);
/* When in doubt, use these options */
ftpRequest.UseBinary = true;
ftpRequest.UsePassive = true;
ftpRequest.KeepAlive = true;
/* Specify the Type of FTP Request */
ftpRequest.Method = WebRequestMethods.Ftp.GetFileSize;
/* Establish Return Communication with the FTP Server */
ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
/* Establish Return Communication with the FTP Server */
ftpStream = ftpResponse.GetResponseStream();

fileSize = (int)ftpResponse.ContentLength;
/* Get the FTP Server’s Response Stream */
StreamReader ftpReader = new StreamReader(ftpStream);
/* Store the Raw Response */
string fileInfo = null;
/* Read the Full Response Stream */
try
{
while (ftpReader.Peek() != -1)
{
fileInfo = ftpReader.ReadToEnd();
}
}
catch (Exception ex)
{
//Bạn nên log những thay Exception tại đây nhé
}
/* Resource Cleanup */
ftpReader.Close();
ftpStream.Close();
ftpResponse.Close();
ftpRequest = null;
/* Return File Size */
return fileSize;
}
catch (Exception ex) { Console.WriteLine(ex.ToString()); }
/* Return an Empty string Array if an Exception Occurs */
return fileSize;
}

Nếu bạn muốn lấy những file trong một thư mục thì hàm sau sẽ giúp bạn và dữ liệu trả về sẽ là một list danh sách tên file và thông tin các các file đó:

/* List Directory Contents in Detail (Name, Size, Created, etc.) */
public List<string> directoryListDetailed(string directory)
{
List<string> listFiles = new List<string>();
this.setFtpForUpload();
try
{
/* Create an FTP Request */
ftpRequest = (FtpWebRequest)FtpWebRequest.Create(host + “/” + directory);
/* Log in to the FTP Server with the User Name and Password Provided */
ftpRequest.Credentials = new NetworkCredential(user, pass);
/* When in doubt, use these options */
ftpRequest.UseBinary = true;
ftpRequest.UsePassive = true;
ftpRequest.KeepAlive = true;
/* Specify the Type of FTP Request */
ftpRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
/* Establish Return Communication with the FTP Server */
ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
/* Establish Return Communication with the FTP Server */
ftpStream = ftpResponse.GetResponseStream();
/* Get the FTP Server’s Response Stream */
StreamReader ftpReader = new StreamReader(ftpStream);
/* Store the Raw Response */
//string directoryRaw = null;
/* Read Each Line of the Response and Append a Pipe to Each Line for Easy Parsing */
try
{
while (ftpReader.Peek() != -1)
{
//directoryRaw += ftpReader.ReadLine() + “|”;
listFiles.Add(ftpReader.ReadLine());
}
}
catch (Exception ex) { Console.WriteLine(ex.ToString()); }
/* Resource Cleanup */
ftpReader.Close();
ftpStream.Close();
ftpResponse.Close();
ftpRequest = null;
/* Return the Directory Listing as a string Array by Parsing ‘directoryRaw’ with the Delimiter you Append (I use | in This Example) */
try
{
return listFiles;
//string[] directoryList = directoryRaw.Split(“|”.ToCharArray()); return directoryList;
}
catch (Exception ex)
{
errorLog.writeErrorToLogFile(ex);
}
}
catch (Exception ex) { Console.WriteLine(ex.ToString()); }
/* Return an Empty string Array if an Exception Occurs */
return new List<string> { “” };
}
}
}

Thắc mắc xin mời các bạn hỏi ạ!

One thought on “Upload File Bằng phương thức FTP trong C#

  1. Vui lòng cho mình hỏi phương thức upload với SFTP thì làm thế nào? vì server bên mình dùng SFTP, mà mình set EnableSSL = true rồi vẫn ko connect đến server ftp được, mong dc giúp đỡ ^_^

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s