vb.net - files - Descarga Resumible de Google Drive V3
upload file google drive c# (2)
Creo que deberías cambiar tu procedimiento Download_ProgressChanged como tihs:
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
El enlace está aquí: https://developers.google.com/drive/v3/web/manage-downloads .
Puede usar bu descargas parciales para calcular bytes de inicio y final.
Utilizo este código para descargar un archivo de Google Drive usando Google Drive api V3:
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
Esto funciona bien con una conexión estable, pero si pierdo la conexión se detiene y espera por siempre, incluso si me vuelvo a conectar.
No tengo este problema con la función de actualización (carga) en este código:
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
Esto funciona exactamente como yo quiero, si pierdo la conexión durante algún tiempo (15 ~ 30s), aparece un mensaje que indica que la carga ha fallado y le da al usuario la opción de reanudar o salir. todo funciona a la perfección
Así que mi pregunta es: cómo hacer que la función de descarga funcione como la función de carga o al menos hacer que no espere para siempre y da un mensaje de error.
Tuve el mismo problema, resolví temporalmente con un "mientras"
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