تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
نظرة على DropBox SDK و التعامل معها +برنامج رفع و تحميل ملفات
#5
(14-04-20, 02:38 AM)ابو ليلى كتب : الان سنقوم بمعالجة عملية الرفع وفق التالي.
سنحدد الملفات التي نريد رفعها عبر CheckBox و من ثم نقوم بالمرور على كل صفوف الجدول فاذا وفق ان الصف محدد 
سنقوم عندها برفع الملف .
PHP كود :
   Private Async Sub Btn_Upload_Click(sender As ObjectAs EventArgsHandles Btn_Upload.Click

        If DGV1
.RowCount 0 Then
            For Each Row 
As DataRow In Dt_FileUpdate.Rows
                If Row IsNot Nothing Then
                    If Row
("Status").ToString "True" Then
                        Lb_FileToUpload
.Text Row("FilePath")
 
                       Btn_Upload.Enabled False
                        Await Uploader
(clientPathRow("FileName"), Row("FilePath"))
 
                       Btn_Upload.Enabled True
                    End 
If

 
               End If
 
           Next
        End 
If


 
   End Sub
End 
Class 
الدالة المسؤولة عن الرفع هي دالة من النوع Asyncronis تحتاج الى عدة وسائط (كائن DropboxClient , مسار الرفع و اسم الملف و مساره) و كلها تتوفر لدينا في الجدول و لكل ملف.

الدالة Uploader :
PHP كود :
   ''' <summary>
    ''' 
رفع ملفات
    
''' </summary>
    ''' 
<param name="dbx"></param>
 
   ''' <param name="folder"></param>
    ''' 
<param name="_file"></param>
 
   ''' <param name="fileToUpload"></param>
    ''' 
<returns></returns>
 
   Private Async Function Uploader(ByVal dbx As DropboxClientByVal folder As StringByVal _file As StringByVal fileToUpload As String) As Task
        Const ChunkSize 
As Integer 1024

        Using fileStream 
File.Open(fileToUploadFileMode.Open)

 
           If fileStream.Length <= ChunkSize Then
                Await dbx
.Files.UploadAsync(folder "/" _fileWriteMode.Overwrite.Instancebody:=fileStream)
 
           Else
                Await UploadWthProgress
(dbxfolder "/" _filefileStreamCInt(ChunkSize))
 
           End If
 
       End Using
    End 
Function


 
   ''' <summary>
    ''' 
الرفع مع بروجرس
    
''' </summary>
    ''' 
<param name="dbx"></param>
 
   ''' <param name="path"></param>
    ''' 
<param name="stream"></param>
 
   ''' <param name="chunkSize"></param>
    ''' 
<returns></returns>
 
   Private Async Function UploadWthProgress(ByVal dbx As DropboxClientByVal path As StringByVal stream As FileStreamByVal chunkSize As Integer) As Task
        Dim numChunks 
As ULong CULng(Math.Ceiling(CDbl(stream.Length) / chunkSize))
 
       Dim buffer As Byte() = New Byte(chunkSize 1) {}
 
       Dim sessionId As String Nothing

        Dim idx 
As ULong 0
        PG2
.Invoke(New Action(Sub()
 
                                 idx 0
                                  Me
.PG2.Value 0
                                  PG2
.Maximum numChunks 1
                              End Sub
))



 
       For idx 0 To numChunks 1
            Dim byteRead 
stream.Read(buffer0chunkSize)

 
           Using memStream = New MemoryStream(buffer0byteRead)

 
               If idx 0 Then
                    Dim result 
Await dbx.Files.UploadSessionStartAsync(FalsememStream)
 
                   sessionId result.SessionId
                Else
                    Dim cursor 
= New UploadSessionCursor(sessionIdCULng(chunkSize) * idx)

 
                   If idx numChunks 1 Then
                        Lb_FileToUpload
.Invoke(New Action(Sub()
 
                                                             Lb_FileToUpload.Text "اكتمل الرفع"
 
                                                             Lb_FileToUpload.Update()
 
                                                         End Sub))

 
                       Dim fileMetadata As FileMetadata Await dbx.Files.UploadSessionFinishAsync(cursor, New CommitInfo(path), memStream)

 
                   Else
                        Await dbx
.Files.UploadSessionAppendV2Async(cursorFalsememStream)
 
                       Lb_FileToUpload.Invoke(New Action(Sub()
 
                                                             Lb_FileToUpload.Text "Uploading..." "  " path "  " numChunks " / " idx
                                                              Lb_FileToUpload
.Update()
 
                                                             Me.PG2.Value idx 1
                                                          End Sub
))

 
                   End If

 
               End If
 
           End Using
        Next
    End 
Function 

الدالة تم تقسيمها الى جزئين و السبب هو وجود ملفات ذات حجم كبير يمكن ان يتم رفعها الى المساحة و بالتالي لا بد من طريقة لاشعار المستخدم ان هناك تقدم في عملية الرفع بدل الانتظار لوقت ظويل دون معرفة ما يجري في الخلفة.
اما الملفات الصغيرة فيتم تحميلها مباشرة دون الشعور بتقدم المؤشر و يمكن التحكم باقل حجم بعده ينطلق الجزء الثاني من الدالة عبر تغير قيمة المتغير ChunkSize .
صراحة تم العمل كثيراً على هذا الجزء الخاص بربط ProgressBar مع عملية التحميل حيث ان العملية غير مدعومة داخل المكتبة .
و كون عملية الرفع تجري في الخلفية في Task منفصل فكان من الصعب جداً الوصول الى طريقة فعالة , و لكن و الحمد لله تم حل المشكلة و هي تعمل بكفاءة.


-------------------------------------------------------------
الشق الثاني المتعلق بتحميل الملفات : يجري بنفس السيناريو حيث نقوم بتحميل اسماء الملفات ضمن المسار المحدد الى ListBox و من ثم نقوم بالمرور على الملفات داخل المسار و نحملها تباعاً الى مسار محدد ستراه داخل الكود.
اجراء التحميل:
PHP كود :
   Private Async Sub Btn_Download_Click(sender As ObjectAs EventArgsHandles Btn_Download.Click

        Dim 
list = Await ListFolder(clientPath)
 
       GroupBox4.Text "Files To Download in Folder : " Path

        Try
            For Each Itm In 
list.Entries

                If Itm
.IsFile Then
                    Btn_Download
.Enabled False
                    Await Downloader
(clientPathItm.AsFile)
 
                   Btn_Download.Enabled True
                End 
If

 
           Next
            Label1
.Text "اكتمل التحميل..."
 
       Catch ex As Exception

        End 
Try

 
   End Sub 
الدالة ListFolder داخل الكود مهمتها مزدوجة تقوم بالمرور على شقين داخل المسار المحدد.
الشق الاول تقوم بجلب كل المجلدات الفرعية داخل المسار , اهذا انا انشأت مجلدات فرعية في بداية الشرح..
الشق الثاني تقوم بجلب كل الملفات داخل المسار المحدد (داخل المجلد المحدد في المسار).
شكل الدالة :
PHP كود :
   ''' <summary>
    ''' 
جلب الملفات من مسار محدد ضمن الموقع
    
'''DropBox المسار هو مجلد داخل 
    ''' 
</summary>
 
   ''' <param name="client"></param>
    ''' 
<param name="path"></param>
 
   ''' <returns></returns>
    Private Async Function ListFolder(ByVal client As DropboxClient, ByVal path As String) As Task(Of ListFolderResult)

        Dim list = Await client.Files.ListFolderAsync(path)
        '
هذا لجلب مجلدات ضمن المسار
        
'For Each item In list.Entries.Where(Function(i) i.IsFolder)
        ' 
   ListBox_Folders.Items.Add(item.Name)
 
       'Next


        ListBox_Files.Items.Clear()
        '
جلب املفات ضمن المسار
        For Each item In 
list.Entries.Where(Function(ii.IsFile)
 
           Dim file item.AsFile
            ListBox_Files
.Items.Add(file.Size " / " item.Name)
 
       Next


        Return 
list
 
   End Function 
اما دالة التحميل  Downloader فهي تقوم بتحميل الملف بدلالة مساره و اسمه القادم من الموقع الى مكان محدد داخل جهازي 
وهو هنا (D:\Test Folder\) يمكنك جعل الامر اكثر تفاعلا بجعل المستخدم يحدد المكان.

شكل الدالة :
PHP كود :
   ''' <summary>
    ''' 
تحميل ملفات تم الدمج وفق طريقتين
    
''' </summary>
    ''' 
<param name="client"></param>
 
   ''' <param name="folder"></param>
    ''' 
<param name="file"></param>
 
   ''' <returns></returns>
    Private Async Function Downloader(ByVal client As DropboxClient, ByVal folder As String, ByVal file As FileMetadata) As Task

        Using response = Await client.Files.DownloadAsync(folder & "/" & file.Name)
            Dim fileSize As ULong = response.Response.Size
            Const bufferSize As Integer = 1024 * 1024
            Dim buffer = New Byte(bufferSize) {}

            Using stream = Await response.GetContentAsStreamAsync()
                Using file2 = New FileStream("D:\Test Folder\" & file.Name, FileMode.OpenOrCreate)
                    Dim length = stream.Read(buffer, 0, bufferSize)
                    While (length > 0)
                        file2.Write(buffer, 0, length)
                        Dim percentage = 100 * CType(file2.Length, ULong) / fileSize
                        Label1.Invoke(New Action(Sub()
                                                     Label1.Text = "Download" & "  " & file.Name & " " & fileSize & " / " & CInt(percentage)
                                                     Label1.Update()
                                                     Me.PG.Value = percentage

                                                 End Sub))


                        length = stream.Read(buffer, 0, bufferSize)

                    End While
                End Using
            End Using

        End Using

    End Function 
الى هنا نكون قد وصلنا الى الهدف من برنامجنا.
المكتبة تمكنك من عمل الكثير من انشاء مجلدات و ملفات و التعديل عليها و الحذف و غيرها من الامور الاعتيادية التي تستطيع التعامل معها , ان كان على مستوى خاص او على مستوى فريق .... الخ
نحن اكتفينا ببعض الامور التي تفيدنا .

الملف المرفق يحتوي على المثال كامل .
ان كنت ستعتمد عليه , فعليك بتغير Access Token الى الخاص بك في اعدادات البرنامج.


صور للاستخدام.












دمتم بخير و الله الموفق.
الرد }}}
تم الشكر بواسطة:


الردود في هذا الموضوع
RE: نظرة على DropBox SDK و التعامل معها +برنامج رفع و تحميل ملفات - بواسطة saif2023 - 08-09-22, 11:54 AM

المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  كيف تتعامل مع برنامج الإكسيل من برنامجك rinawi 7 7,225 12-11-22, 12:11 AM
آخر رد: خالد العصاوي
  دمج ملفات المشروع ابو روضة 4 2,090 11-11-22, 09:50 PM
آخر رد: ابو روضة
  برنامج مبيعات ومشتريات وإدارة أعمال ( الفاتورة الإلكترونية ) yassoo1985 2 2,820 04-06-22, 01:14 PM
آخر رد: yassoo1985
Heart طلب برنامج Advanced Installer أبو خالد الشكري 0 1,717 16-05-22, 09:12 PM
آخر رد: أبو خالد الشكري
  أهم طرق إدارة المخازن وتطبيقها على برنامج مخازن وارد ومنصرف Menna ahmeed 0 2,822 27-04-22, 12:52 PM
آخر رد: Menna ahmeed
  طريقة إنشاء برنامج طباعة ملصقات الباركود ملهمـ 1 5,019 22-12-21, 05:09 PM
آخر رد: alessam4pro
  التعامل مع الصور Images في بيئة الدوت نت باستخدام +GDI - مقدمة RaggiTech 3 6,341 30-07-21, 05:14 PM
آخر رد: kebboud
Lightbulb [مقال] التعامل مع ملفات اوفيس من خلال مكتبة NPOI ابو ليلى 2 4,616 01-07-21, 11:42 AM
آخر رد: kebboud
Heart [VB.NET] برنامج ادارة المطاعم و الكافيهات mgr21002100 6 7,410 14-01-21, 07:59 PM
آخر رد: abarrak
Lightbulb [مقال] التعامل مع اختصارات الملفات Shortcuts Magic Sword 2 4,707 01-10-20, 11:36 AM
آخر رد: abomo3ath

التنقل السريع :


يقوم بقرائة الموضوع: