2017-04-24 2 views
4

Ich benutze diesen Code eine Datei von Google Drive mit Google Drive api V3 zum Download:Google Drive V3 Wiederaufnehmbare Herunterladen

Function gDownload() As Boolean 

      Dim fileID As String = "0B-W1aRTTOB1QM3hPd0dOUFVObHM" 
      Dim stream = New System.IO.MemoryStream()   
      Dim r = service.Files.Get(fileID) 
      Dim m = r.MediaDownloader 
      m.ChunkSize = 256 * 1024 
      AddHandler m.ProgressChanged, AddressOf Download_ProgressChanged  
    mStart:  
      r.Download(stream)  
      Return True ' or False if download failed 

    End Function 

    Private Sub Download_ProgressChanged(s As IDownloadProgress) 
      Console.WriteLine(s.Status.ToString & " " & s.BytesDownloaded) 
    End Sub 

Dies funktioniert gut mit einer stabilen Verbindung, aber wenn ich Verbindung verlieren sie stoppt und wartet immer, auch wenn Ich verbinde mich wieder.

Ich habe dieses Problem nicht mit Update (Upload) Funktion in diesem Code:

Function gUpload() As Boolean 

     Dim fileID As String = "0B-W1aRTTOB1QM3hPd0dOUFVObHM" 
     Dim stream As New System.IO.FileStream("D:\gtest\Test.mp4", System.IO.FileMode.Open) 
     Dim fBody As File = New File With {.Name = "Test.mp4"} 

     Dim r = service.Files.Update(fBody, fileID, stream, "application/octet-stream") 
     r.ChunkSize = ResumableUpload.MinimumChunkSize 
     AddHandler r.ProgressChanged, AddressOf Upload_ProgressChanged 

    mStart: 
     r.Resume() 
     If r.GetProgress.Status = 3 Then ' UploadStatus.Completed 
      Return True 
     Else 
      If MessageBox.Show("Failed. do you want to resume?", "Failed", MessageBoxButtons.YesNo) = DialogResult.Yes Then 
       GoTo mStart 
      End If 
     End If 
     Return False 
End Function  

Private Sub Upload_ProgressChanged(s As IUploadProgress) 
    Console.WriteLine(s.Status.ToString & " " & s.BytesSent) 
End Sub 

Dies funktioniert genau so, wie ich will, wenn ich Verbindung für einige Zeit zu verlieren (15 ~ 30) gibt es eine Die Nachricht, dass der Upload fehlgeschlagen ist, gibt einem Benutzer die Möglichkeit, den Vorgang fortzusetzen oder zu beenden. alles funktioniert perfekt.

Also meine Frage ist: Wie man die Download-Funktion funktioniert wie die Upload-Funktion oder zumindest machen es nicht ewig warten und gibt eine Fehlermeldung.

Antwort

1

hatte ich das gleiche Problem, ich beschlossen, vorübergehend mit einem „während“

Request.DownloadAsync(Stream) 

    Dim bytes_downloaded As Long = 0 
    Dim not_downloaded As Integer = 0 
    Dim progress As Integer = Stream.Length 
    Do While progress < file_size 
     progress = Stream.Length 

     If progress = bytes_downloaded Then 
      not_downloaded += 1 
      If not_downloaded >= 900 Then '90 seconds 
       ' msg download falhou 
       Exit Do 
      End If 
     Else 
      not_downloaded = 0 
     End If 
     bytes_downloaded = progress 
     Threading.Thread.Sleep(100) 
    Loop 
+0

Vielen Dank, ich habe eine ähnliche Lösung gefunden, aber Google Drive hat einen besseren Weg und wir konnten ihn nicht finden. – Fadi

1

Ich glaube, Sie sollten Ihre Download_ProgressChanged Verfahren wie tihs ändern:

Private Sub Download_ProgressChanged(s As IDownloadProgress) 
    Select Case s.Status 
    Case DownloadStatus.Downloading 
     If True Then 
      Console.WriteLine(progress.BytesDownloaded) 
      Exit Select 
     End If 
    Case DownloadStatus.Completed 
     If True Then 
      Console.WriteLine("Download complete.") 
      Exit Select 
     End If 
    Case DownloadStatus.Failed 
     If True Then 
      Console.WriteLine("Download failed.") 
      Exit Select 
     End If 
    End Select 
End Sub 

Link ist hier: https://developers.google.com/drive/v3/web/manage-downloads.

Sie können partiellen Download verwenden, müssen Sie Anfang und Ende Bytes berechnen.

+0

Danke, aber 's.Status' ist immer‚DownloadStatus.Downloading' und werden nie 'Failed' oder' schloss'ab . – Fadi

Verwandte Themen