14-04-20, 01:04 AM
التعامل مع DropBox Api - تحديداً DropBox SDK V2
بسم الله الرحمن الرحيم و الصلاة و السلام على سيدنا محمد و على آله و صحبه اجمعين
السلام عليكم و رحمة الله و بركاته
---------------------------------------------
يعد موقع DropBox مقصداً للكثير من المطورين لسهولة التعامل معه في رفع و تحميل الملفات.
و نظراً لاننا نتعامل معه بطريقة او باخرى من خلال برامجنا , ولاننا نفتقد لاي مصدر عربي يسهل علينا التعامل مع Api الخاص بالموقع,
لما يوفره من سهولة في التعامل و يفتح لنا ابواب اوسع لمعالجة امور كنا بحاجتها دوماً.
--------------------------------------------
فقد قررت كتابة هذه المقال لسببين :
الاول : هو اضاءة على الـ Api الخاص بهم للاستفادة منه في برامجنا.
الثاني : ايجاد طريقة اكثر تفاعلاً مع تحميل الملفات للاخوة الذين يتعاملون مع الموقع لتحديث برامجهم.
-------------------------------------------
في البداية ننشئ برنامج و من ثم نقوم بتحميل المكتبة لبرنامجنا عبر Manage NuGet Packages
بعد التحميل وفق الصور السابقة ننتقل الى الفورم الرئيسي لدينا .
فكرة البرنامج هو التعامل مع المكتبة وفق مسارين
1- رفع ملفات الى مساحتنا على الموقع.
2- تحميل ملفات من مساحتنا في الموقع.
سندخل الى الموقع اولاً و ننشئ بداخل المساحة مجلد لنرفع بداخله ملفاتنا.
من الجيد اذا كنت ممن لديه عدة برامج و رغبت ان يكون لكل برنامج مجلد خاص ترفع له ملفاتك , ان تنشأ مجلد خاص بكل برنامج.
نبقى مع الصور
سنستخدم المجلد Folder1 لنرفع اليه ملفاتنا كتجربة.
للتعامل مع المكتبة من خلال برنامجك يجب ان تمتلك حق الولوج الى Api الخاص بالموقع لذا يجب عليك ان تمتلك Access Token
سنتعرف الى طريقة انشائها عبر الموقع بخطوات بسيطة عبر الصور.
الان و بعد ان تحصلت على Access Token انسخه و احتفظ به لاننا سنحتاجه للتعامل مع المكتبة عبر برنامجنا.
جهز نفسك لننطلق في تجهيز البرنامج...
سننتقل الى الفورم الرئيسي لدينا و نصممه كما في الصورة
قررت تقسيم الشاشة الى قسمين واحد لرفع الملفات و الثاني لتحميل الملفات
شرح الارقام بالترتيب و ما يقابلها من سيناريوهات.
اولاً القسم الخاص برفع الملفات.
1- GetFiles سيكون لدينا اجراء يقوم بفتح مستعرض المجلدات لتحديد الملفات داخل المجلد.
2- DataGridView صمم ليعرض لنا اسماء الملفات داخل المجلد المحدد سابقاً مع معلومات عن حجم كل ملف و رقم النسخة الخاصة به و مسار الملف.
تجدر الاشارة الى ان الملفات التي لا تحمل في خصائصا رقم نسخة سنقوم باعطائها الرقم صفر.
العمود Status داخل القريد من النوع CheckBox سنستخدمه لتحديد الملفات التي نريد رفعها.
3- Upload سيقابله اجراء يقوم بالمرور على الملفات المحددة و رفعها الى مسار محدد داخل مساحتنا , المجلد Folder1 الذي انشأناه سابقاً.
4- يعرض لنا الملف الحالي الجاري رفعه الى المسار المحدد مع عرض نسبة الرفع بالتزامن مع ProgresBar فوقه لتكون العملية تفاعلية.
هذا فيما يخص قسم الرفع.
ثانياً القسم الخاص بالتحميل
5- يعرض لنا المسار الذي يتم التحميل منه.
6- هنا تظهر الملفات التي داخل المسار السابق.
7- Download يقابله اجراء يقوم بالمرور على الملفات السابقة و البدء بتحميلها الى القرص المحلي وفق المسار المعطى داخل الكود.
8- يعرض الملف الحالي الجاري تحميله مع نسبة التقدم بالتوامن مع ProgresBar تفاعلي.
كل العمليات من رفع و تحميل تتم بشكل تزامني Asyncronis و تجري اغلب العمليات في مهام منفصلة لكي لا نواجه مشاكل التجميد
حيث يمكنك الرفع و التحميل في نفس الوقت.
ندخل الى محرر الاكواد الخاص بنا لنتعرف الى اهم عناصر المكتبة.
في البداية يلزمنا استيراد الفضاءات التالية لنتمكن من العمل.
PHP كود :
Imports Dropbox.Api
Imports Dropbox.Api.Files
Imports System.IO
Imports System.Net
لذا سنقوم بتعريف اجراء يقوم بفتح المستعرض على مكان محدد لنسحب الملفات بداخله الى القريد الخاص بنا.
سنقوم ببناء جدول له نفس اعمدة القريد و نخزن داخله المعلومات القادمة من كل ملف و من ثم نسنده الى القريد.
PHP كود :
Private Function BuildTable() As DataTable
Dim Dt As New DataTable
Dim Columns As New List(Of DataColumn)
Columns.Add(New DataColumn With {.ColumnName = "Status"})
Columns.Add(New DataColumn With {.ColumnName = "FileName"})
Columns.Add(New DataColumn With {.ColumnName = "FileSize"})
Columns.Add(New DataColumn With {.ColumnName = "Version"})
Columns.Add(New DataColumn With {.ColumnName = "FilePath"})
Dt.Columns.AddRange(Columns.ToArray)
Return Dt
End Function
الان سيكون لدينا اجراء لجلب الملفات و المرور على كل ملف و نستخلص منه الاسم و الحجم و رقم النسخة و المسار.
PHP كود :
Dim Dt_FileUpdate As New DataTable
Private Sub Btn_CollectFiles_Click(sender As Object, e As EventArgs) Handles Btn_CollectFiles.Click
If (FolderBrowserDialog1.ShowDialog() = DialogResult.OK) Then
Txt_Path.Text = FolderBrowserDialog1.SelectedPath
Dt_FileUpdate = BuildTable()
Try
Me.Cursor = Cursors.WaitCursor
For Each f In Directory.GetFiles(Txt_Path.Text, "*", IO.SearchOption.AllDirectories)
Dim _file As New IO.FileInfo(f)
FileVersionInfo.GetVersionInfo(f)
Dim myFileVersionInfo As FileVersionInfo = FileVersionInfo.GetVersionInfo(f)
Dim F_Version As String = myFileVersionInfo.FileVersion
If String.IsNullOrEmpty(F_Version) Then F_Version = 0
Dim Row As String() = New String() {"False", _file.Name, GetSizeKB(f), F_Version, f}
Dt_FileUpdate.Rows.Add(Row)
Next
DGV1.DataSource = Dt_FileUpdate
Me.Cursor = Cursors.Arrow
Catch ex As UnauthorizedAccessException
MsgBox(ex.Message)
Me.Cursor = Cursors.Arrow
End Try
End If
End Sub
الاجراء يقوم باضافة معلومات كل ملف الى الجدول Dt_FileUpdate .
الاجراء المسؤول عن حجم كل ملف كالتالي:
PHP كود :
Public Function GetSizeKB(ByVal filename As String) As Double
Dim len As Double = New FileInfo(filename).Length / 1024
Return String.Format("{0:0.##}", len)
End Function
عند هذه النقطة سنحتاج الى كائنات رئيسية من المكتبة الخاصة بـ DropBox.
الكائن الرئيسي في هذه المكتبة هو DropboxClient , هو المسؤول عن التخاطب و الارسال و الاستقبال...
داخل هذا الكائن سنرسل Access Token التي حصلنا عليها سابقاً , و هي ترسل كوسيطة نصية.
كما و يرتبط هذا الكائن بشكل وثيق مع HttpClient الخاص بالمكتبة Http.HttpClient . و هي المكتبة الحديثة من اطار عمل الدوت نت
وهذه المكتبة صصمت للتعامل بشكل تزامني مع ملفات الانترنت و المواقع.
يحتاج الكائن الى ضبط بعض الاعدادات البسيطة.
نعرف هذه المتغيرات في بداية النموذج.
PHP كود :
Dim config As DropboxClientConfig
Dim client As DropboxClient
Dim httpClient As Http.HttpClient
Dim Path As String = "/UpdateFolder63/Folder1" 'مسار المجلد في الموقع
PHP كود :
'تعريفات و ضبط اعدادت
httpClient = New Http.HttpClient(New Http.WebRequestHandler With {
.ReadWriteTimeout = 10 * 1000}) With {.Timeout = TimeSpan.FromMinutes(20)}
config = New DropboxClientConfig("AnyThing") With {.HttpClient = httpClient}
client = New DropboxClient(My.Settings.AccessToken, config)
يتبع ....