Mã mẫu chương trình FTP client (mã nguồn C#): kết nối đến máy chủ FTP của DriveHQNhiều người dùng đã hỏi về cách kết nối với máy chủ FTP của DriveHQ trong các dự án phần mềm của họ. Trong thông báo này, trước tiên chúng tôi muốn cung cấp một số thông tin chung về FTP, sau đó là một số mã nguồn C#.
DriveHQ cung cấp dịch vụ lưu trữ máy chủ FTP. Chúng tôi hỗ trợ các giao thức FTP và FTPS thông thường. Một trong những ưu điểm chính của dịch vụ FTP của chúng tôi là: nó được tích hợp liền mạch với các dịch vụ CNTT đám mây rộng lớn của chúng tôi. Người dùng có thể truy cập các tệp FTP của họ bằng trình duyệt web. ổ đĩa được ánh xạ (WebDAV) hoặc phần mềm quản lý tệp DriveHQ FileManager. Họ cũng có thể sử dụng công cụ Quản trị nhóm dựa trên web của chúng tôi để tạo và quản lý người dùng FTP (người dùng phụ).
Giao thức FTP thông thường được coi là không an toàn vì nó truyền dữ liệu mà không mã hóa. Để có bảo mật SSL mạnh mẽ, bạn có thể sử dụng FTPS (FTP qua SSL/TLS). Có hai phương pháp để kích hoạt bảo mật SSL:
Ngầm định: Ứng dụng FTP client kết nối trực tiếp đến một số cổng FTPS đặc biệt (mặc định là 990);
Rõ ràng (FTPES): Ứng dụng FTP client kết nối đến cổng FTP thông thường số 21, sau đó phát lệnh STARTTLS để nâng cấp bảo mật.
Máy chủ FTP của DriveHQ hỗ trợ cả FTPS và FTPES. Hầu hết các ứng dụng khách FTP đều hỗ trợ FTPS và FTPES, ví dụ như FileZilla, CuteFTP, WsFTP, SmartFTP, WinSCP và Fetch, v.v.
Có một giao thức truyền tải tập tin an toàn khác tên là SFTP, thường bị nhầm lẫn với "Secure FTP"; trên thực tế, nó có nghĩa là "SSH File Transfer Protocol", một giao thức truyền tải tập tin hoàn toàn khác. Về mặt bảo mật, SSL/TLS và SSH gần như tương đương nhau. Rõ ràng SSL/TLS phổ biến hơn SSH. Máy chủ FTP của DriveHQ không hỗ trợ SFTP vì chúng tôi không thấy cần thiết phải sử dụng SFTP.
Chế độ chủ động và thụ động FTP:
Một kết nối FTP có thể bao gồm hai kết nối TCP (kênh), kênh lệnh và kênh dữ liệu. Kênh lệnh được sử dụng để gửi các lệnh FTP; kênh dữ liệu được sử dụng để truyền tải lượng dữ liệu lớn. Chế độ FTP chủ động yêu cầu máy chủ FTP kết nối ngược lại với máy khách FTP để thiết lập kết nối dữ liệu. Điều này thường được coi là không an toàn và bị chặn bởi nhiều tường lửa/bộ định tuyến. Chế độ FTP thụ động yêu cầu máy khách FTP kết nối với máy chủ FTP trên một số cổng khác. Nó được coi là an toàn và hiếm khi bị chặn. Máy chủ FTP của DriveHQ hỗ trợ cả FTP chủ động và thụ động. Tuy nhiên, nếu bộ định tuyến/tường lửa hoặc phần mềm bảo mật của bạn chặn FTP chủ động, thì nó sẽ không hoạt động. Điều đáng chú ý là hầu hết các bộ định tuyến mới đều hỗ trợ FTP chủ động.
Xin lưu ý: Trình khách FTP dòng lệnh của Microsoft không hỗ trợ FTP thụ động. Hầu hết các chương trình khách FTP khác đều hỗ trợ cả FTP chủ động và FTP thụ động.
FTP và ProFTP
DriveHQ có hai máy chủ FTP, một là ftp.drivehq.com, dành cho tất cả người dùng; máy chủ còn lại là proftp.drivehq.com, chỉ dành cho thành viên trả phí (bao gồm cả người dùng phụ của tài khoản nhóm trả phí). Vì proftp.drivehq.com chỉ dành cho thành viên trả phí nên nó không hỗ trợ FTP ẩn danh. Để biết thêm thông tin về dịch vụ lưu trữ máy chủ FTP của chúng tôi, vui lòng truy cập..:
http://www.drivehq.com/servicemanual.aspx#_Toc265186728
Mã nguồn mẫu của ứng dụng khách FTP
Đoạn mã nguồn C# sau đây được cung cấp nguyên trạng mà không có bất kỳ sự hỗ trợ nào. Bạn có thể tự do sử dụng nó trong phần mềm của riêng mình hoặc phân phối lại. Mã mẫu này cho thấy cách kết nối với máy chủ FTP của chúng tôi và thực hiện các lệnh FTP, chẳng hạn như LIST, GET và PUT; bạn cũng có thể thấy cách thiết lập để sử dụng FTP thụ động và SSL.
sử dụng hệ thống;
sử dụng System.Collections.Generic;
sử dụng System.Linq;
sử dụng System.Text;
sử dụng System.Threading.Tasks;
Sử dụng System.Net;
sử dụng System.IO;
sử dụng System.Security.Cryptography.X509Certificates;
///
/// Bản quyền (c) 2003-2016, Drive Headquarters, Inc.
///
/// Đoạn mã mẫu của ứng dụng khách FTP cho thấy cách kết nối với máy chủ FTP của DriveHQ bằng ngôn ngữ C#.
/// Bạn có thể sử dụng mã nguồn hoặc phân phối lại miễn phí. Mã nguồn được cung cấp nguyên trạng, không kèm theo bất kỳ điều kiện nào
/// DriveHQ không chịu bất kỳ trách nhiệm pháp lý nào phát sinh từ việc sử dụng mã này.
///
không gian tên FTPClientSample
{
Chương trình lớp
{
static string ftpServer = "ftp.drivehq.com"; // Bạn cũng có thể sử dụng proftp.drivehq.com nếu bạn có tài khoản trả phí.
static string username = "YOUR_USERNAME"; // Tên người dùng DriveHQ của bạn
static string password = "YOUR_PASSWORD"; // Mật khẩu DriveHQ của bạn
static void Main(string[] args)
{
// Liệt kê các thư mục trên máy chủ FTP
//Danh sách("/");
// Tải xuống tệp từ máy chủ FTP
//DownloadFile("ServerFileName.jpg", @"c:\temp\ClientFileName.jpg");
// Tải tệp lên máy chủ FTP
UploadFile(@"c:\temp\ClientFileName.jpg", "/temp/ServerFileName.jpg");
}
///
/// Tải tệp lên máy chủ FTP.
///
/// đường dẫn trên máy chủ FTP, ví dụ: /temp/filename
///
public static bool UploadFile(string srcFilePath, string destFilePath = null)
{
nếu (String.IsNullOrWhiteSpace(srcFilePath))
ném ngoại lệ ArgumentNullException mới ("Đường dẫn tệp nguồn.");
if (String.IsNullOrWhiteSpace(destFilePath))
destFilePath = Path.GetFileName(srcFilePath);
Máy chủ UriUri = GetUri(destFilePath);
// serverUri nên bắt đầu bằng định dạng ftp://.
nếu (serverUri.Scheme != Uri.UriSchemeFtp)
Trả về false;
FtpWebRequest request = CreateFtpRequest(serverUri, WebRequestMethods.Ftp.UploadFile);
// đọc nội dung tệp vào mảng byte
FileStream sourceStream = new FileStream(srcFilePath, FileMode.Open, FileAccess.Read);
byte[] fileContent = new byte[sourceStream.Length];
sourceStream.Read(fileContent, 0, fileContent.Length);
sourceStream.Close();
// gửi nội dung tệp đến máy chủ FTP
request.ContentLength = fileContent.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(fileContent, 0, fileContent.Length);
requestStream.Close();
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Console.WriteLine("Trạng thái phản hồi: {0} - {1}", response.StatusCode, response.StatusDescription);
Trả về giá trị đúng;
}
///
/// Tải tệp tin có đường dẫn srcFilePath từ máy chủ FTP về thư mục destFilePath. Nếu giá trị là null, hãy lưu vào thư mục hiện tại.
///
///
public static bool DownloadFile(string srcFilePath, string destFilePath = null)
{
nếu (String.IsNullOrWhiteSpace(srcFilePath))
ném ngoại lệ ArgumentNullException mới ("Đường dẫn tệp nguồn.");
if (String.IsNullOrWhiteSpace(destFilePath))
destFilePath = Path.GetFileName(srcFilePath);
Máy chủ UriUri = GetUri(srcFilePath);
//// serverUri nên bắt đầu bằng định dạng ftp://.
nếu (serverUri.Scheme != Uri.UriSchemeFtp)
Trả về false;
FtpWebRequest request = CreateFtpRequest(serverUri, WebRequestMethods.Ftp.DownloadFile);
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
FileStream fileStream = new FileStream(destFilePath, FileMode.OpenOrCreate, FileAccess.Write);
byte[] buffer = new byte[32 * 1024];
trong khi (đúng) {
int bytesRead = responseStream.Read(buffer, 0, buffer.Length);
nếu (bytesRead == 0)
phá vỡ;
fileStream.Write(buffer, 0, bytesRead);
}
fileStream.Close();
Console.WriteLine("Trạng thái phản hồi: {0} - {1}", response.StatusCode, response.StatusDescription);
Trả về giá trị đúng;
}
///
/// Liệt kê nội dung của thư mục FTP
///
///
public static string List(string path)
{
Uri serverUri = GetUri(path);
//// serverUri nên bắt đầu bằng định dạng ftp://.
nếu (serverUri.Scheme != Uri.UriSchemeFtp)
trở lại "";
FtpWebRequest request = CreateFtpRequest(serverUri, WebRequestMethods.Ftp.ListDirectory);
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
string result = sr.ReadToEnd();
Console.WriteLine("Trạng thái phản hồi: {0} - {1}", response.StatusCode, response.StatusDescription + "\r\n" + result);
Trả về kết quả;
}
private static FtpWebRequest CreateFtpRequest(Uri serverUri, string method)
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverUri);
request.EnableSsl = true;
request.UsePassive = true;
request.UseBinary = true;
request.KeepAlive = true;
request.Credentials = new NetworkCredential(username, password);
request.Method = method;
yêu cầu trả về;
}
private static Uri GetUri(string remoteFilePath)
{
Uri ftpServerUri = new Uri("ftp://" + ftpServer);
return new Uri(ftpServerUri, remoteFilePath);
}
}
}