نموذج كود عميل FTP (كود مصدر C#): الاتصال بخادم FTP الخاص بـ DriveHQتساءل العديد من المستخدمين عن كيفية الاتصال بخادم FTP الخاص بـ DriveHQ في مشاريعهم البرمجية. في هذه الرسالة، نود أن نقدم بعض المعلومات العامة حول بروتوكول FTP أولاً، متبوعة ببعض أكواد C# المصدرية.
تقدم DriveHQ خدمة استضافة خوادم FTP. ندعم بروتوكولات FTP وFTPS الشائعة. من أهم مزايا خدمة FTP لدينا: تكاملها السلس مع خدماتنا السحابية الشاملة. يمكن للمستخدمين الوصول إلى ملفات FTP الخاصة بهم باستخدام متصفح الويب. محرك أقراص مُعيّن (WebDAV) أو برنامج عميل DriveHQ FileManager. كما يمكنهم استخدام أداة إدارة المجموعات عبر الإنترنت لإنشاء وإدارة مستخدمي FTP (المستخدمين الفرعيين).
يُعتبر بروتوكول FTP العادي غير آمن لأنه ينقل البيانات بدون تشفير. ولضمان أمان قوي باستخدام SSL، يمكنك استخدام FTPS (بروتوكول نقل الملفات عبر SSL/TLS). توجد طريقتان لتفعيل أمان SSL:
ضمني: يتصل عميل FTP مباشرة برقم منفذ FTPS خاص (الافتراضي هو 990)؛
صريح (FTPES): يتصل عميل FTP بمنفذ FTP العادي رقم 21، ثم يصدر الأمر STARTTLS لترقية الأمان.
يدعم خادم FTP الخاص بـ DriveHQ كلاً من بروتوكولي FTPS وFTPES. كما تدعم معظم تطبيقات عميل FTP كلا البروتوكولين، مثل FileZilla وCuteFTP وWsFTP وSmartFTP وWinSCP وFetch، وغيرها.
يوجد بروتوكول آخر لنقل الملفات الآمن يُسمى SFTP، والذي يُخلط غالبًا مع "بروتوكول نقل الملفات الآمن"؛ في الواقع، هو اختصار لـ "بروتوكول نقل الملفات عبر SSH"، وهو بروتوكول مختلف تمامًا. من وجهة نظر أمنية، يُعتبر كل من SSL/TLS وSSH متماثلين تقريبًا. من الواضح أن SSL/TLS أكثر شيوعًا من SSH. لا يدعم خادم FTP الخاص بـ DriveHQ بروتوكول SFTP لعدم وجود حاجة ماسة إليه.
وضع FTP النشط والسلبي:
قد يتضمن اتصال FTP قناتين TCP، قناة الأوامر وقناة البيانات. تُستخدم قناة الأوامر لإرسال أوامر FTP، بينما تُستخدم قناة البيانات لنقل كميات كبيرة من البيانات. يتطلب وضع FTP النشط من خادم FTP الاتصال بعميل FTP لإنشاء اتصال البيانات. يُعتبر هذا الوضع غير آمن في كثير من الأحيان، ويتم حظره بواسطة العديد من جدران الحماية وأجهزة التوجيه. أما وضع FTP السلبي، فيتطلب من عميل FTP الاتصال بخادم FTP عبر منفذ مختلف. يُعتبر هذا الوضع آمنًا ونادرًا ما يتم حظره. يدعم خادم FTP الخاص بـ DriveHQ كلا الوضعين النشط والسلبي. مع ذلك، إذا كان جهاز التوجيه/جدار الحماية أو برنامج الأمان الخاص بك يحظر وضع FTP النشط، فلن يعمل. ومن الجدير بالذكر أن معظم أجهزة التوجيه الحديثة تدعم وضع FTP النشط.
يرجى الملاحظة: لا يدعم عميل FTP الخاص بسطر الأوامر من مايكروسوفت بروتوكول FTP السلبي. بينما تدعم جميع برامج عملاء FTP الأخرى تقريبًا كلاً من بروتوكول FTP النشط والسلبي.
بروتوكول نقل الملفات (FTP) وبروتوكول نقل الملفات الاحترافي (ProFTP)
لدى DriveHQ موقعان لبروتوكول نقل الملفات (FTP)، أحدهما ftp.drivehq.com، وهو متاح لجميع المستخدمين؛ والآخر proftp.drivehq.com، وهو متاح للأعضاء المشتركين فقط (بما في ذلك المستخدمين الفرعيين لحساب المجموعة المشترك). ولأن proftp.drivehq.com متاح للأعضاء المشتركين فقط، فإنه لا يدعم بروتوكول نقل الملفات المجهول. لمزيد من المعلومات حول خدمة استضافة خادم FTP، يُرجى زيارة:
http://www.drivehq.com/servicemanual.aspx#_Toc265186728
نموذج لرمز مصدر عميل FTP
يُقدَّم كود المصدر التالي بلغة C# كما هو دون أي دعم. يمكنك استخدامه بحرية في برامجك الخاصة، أو إعادة توزيعه. يُوضِّح الكود النموذجي كيفية الاتصال بخادم FTP الخاص بنا وتنفيذ أوامر FTP، مثل LIST وGET وPUT؛ كما يُمكنك الاطلاع على كيفية ضبطه لاستخدام بروتوكول FTP السلبي وSSL.
باستخدام النظام؛
باستخدام System.Collections.Generic؛
باستخدام System.Linq؛
باستخدام System.Text؛
باستخدام System.Threading.Tasks؛
باستخدام System.Net؛
باستخدام System.IO؛
باستخدام System.Security.Cryptography.X509Certificates؛
/// <ملخص>
/// جميع الحقوق محفوظة © 2003-2016، شركة درايف هيدكوارترز.
///
/// يوضح نموذج التعليمات البرمجية لعميل FTP كيفية الاتصال بخادم FTP الخاص بـ DriveHQ باستخدام لغة C#.
/// يمكنك استخدام الكود أو إعادة توزيعه مجانًا. يُقدَّم الكود كما هو، بدون أي رسوم إضافية
/// لا يوجد أي دعم أو ضمان. لن تتحمل DriveHQ أي مسؤولية عن استخدام الكود.
///
مساحة الاسم FTPClientSample
{
برنامج الفصل
{
static string ftpServer = "ftp.drivehq.com"; // يمكنك أيضًا استخدام proftp.drivehq.com إذا كان لديك حساب مدفوع.
static string username = "YOUR_USERNAME"; // اسم المستخدم الخاص بك في DriveHQ
static string password = "YOUR_PASSWORD"; // كلمة مرور DriveHQ الخاصة بك
static void Main(string[] args)
{
// اعرض قائمة بالمجلدات على خادم FTP
//قائمة("/")؛
// قم بتنزيل ملف من خادم FTP
//DownloadFile("ServerFileName.jpg", @"c:\temp\ClientFileName.jpg");
// قم بتحميل ملف إلى خادم FTP
UploadFile(@"c:\temp\ClientFileName.jpg", "/temp/ServerFileName.jpg");
}
/// <ملخص>
/// قم بتحميل ملف إلى خادم FTP.
///
/// المسار على خادم FTP، مثل /temp/filename
///
public static bool UploadFile(string srcFilePath, string destFilePath = null)
{
إذا كان (String.IsNullOrWhiteSpace(srcFilePath))
throw new ArgumentNullException("مسار ملف المصدر.");
إذا كان (String.IsNullOrWhiteSpace(destFilePath))
destFilePath = Path.GetFileName(srcFilePath);
Uri serverUri = GetUri(destFilePath);
// يجب أن يبدأ عنوان الخادم (serverUri) بمخطط ftp://.
إذا كان (serverUri.Scheme != Uri.UriSchemeFtp)
أعد القيمة خطأ؛
FtpWebRequest request = CreateFtpRequest(serverUri, WebRequestMethods.Ftp.UploadFile);
// قراءة محتوى الملف إلى مصفوفة بايت
FileStream sourceStream = new FileStream(srcFilePath, FileMode.Open, FileAccess.Read);
byte[] fileContent = new byte[sourceStream.Length];
sourceStream.Read(fileContent, 0, fileContent.Length);
sourceStream.Close();
// أرسل محتوى الملف إلى خادم FTP
request.ContentLength = fileContent.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(fileContent, 0, fileContent.Length);
requestStream.Close();
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Console.WriteLine("حالة الاستجابة: {0} - {1}", response.StatusCode, response.StatusDescription);
أعد القيمة true؛
}
/// <ملخص>
/// قم بتنزيل ملف المصدر (srcFilePath) من خادم FTP إلى ملف الوجهة (destFilePath). إذا كان الملف فارغًا، فاحفظه في المجلد الحالي.
///
///
public static bool DownloadFile(string srcFilePath, string destFilePath = null)
{
إذا كان (String.IsNullOrWhiteSpace(srcFilePath))
throw new ArgumentNullException("مسار ملف المصدر.");
إذا كان (String.IsNullOrWhiteSpace(destFilePath))
destFilePath = Path.GetFileName(srcFilePath);
Uri serverUri = GetUri(srcFilePath);
//// يجب أن يبدأ عنوان الخادم (serverUri) بمخطط ftp://.
إذا كان (serverUri.Scheme != Uri.UriSchemeFtp)
أعد القيمة خطأ؛
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];
بينما (صحيح) {
int bytesRead = responseStream.Read(buffer, 0, buffer.Length);
إذا كانت قيمة (bytesRead == 0)
استراحة؛
fileStream.Write(buffer, 0, bytesRead);
}
fileStream.Close();
Console.WriteLine("حالة الاستجابة: {0} - {1}", response.StatusCode, response.StatusDescription);
أعد القيمة true؛
}
/// <ملخص>
/// اعرض محتويات مجلد FTP
///
///
public static string List(string path)
{
Uri serverUri = GetUri(path);
//// يجب أن يبدأ عنوان الخادم (serverUri) بمخطط ftp://.
إذا كان (serverUri.Scheme != Uri.UriSchemeFtp)
يعود ""؛
FtpWebRequest request = CreateFtpRequest(serverUri, WebRequestMethods.Ftp.ListDirectory);
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
string result = sr.ReadToEnd();
Console.WriteLine("حالة الاستجابة: {0} - {1}", response.StatusCode, response.StatusDescription + "\r\n" + result);
أعد النتيجة؛
}
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;
طلب الإرجاع؛
}
private static Uri GetUri(string remoteFilePath)
{
Uri ftpServerUri = new Uri("ftp://" + ftpServer);
أعد كائن Uri جديدًا (ftpServerUri، remoteFilePath)؛
}
}
}