2017-08-10 5 views
1

Je souhaite télécharger un fichier à partir de Google Drive avec vb.net. J'ai un gridview où à liste tous mes fichiers existent dans le lecteur, et quand je sélectionne un fichier (dans la grille), je le télécharge. après la recherche dans différents site, j'essayer de le faire, mais j'ai un problèmeTélécharger un fichier à partir du lecteur

Voici mon code

Public Sub DownloadFile(index As String) 
    CreateService() 
    Dim url As String = "" 
    Dim list = Service.Files.List() 
    ' list.Fields = "nextPageToken, items(id, title)" 
    Dim count = list.Execute() 
    For Each fich In count.Items 
     If (fich.Title = index) Then 
      url = fich.WebContentLink 
      Exit For 
     End If 
    Next 
    Dim Downloader = New MediaDownloader(Service) 
    ' figure out the right file type base on UploadFileName extension 
    Dim Filename = index 
    Dim FileStream = New System.IO.FileStream(Filename, System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite) 
    Dim progress = Downloader.DownloadAsync(url, FileStream) 
    If DownloadStatus.Downloading.Completed Then 
     MessageBox.Show("succeful download") 
    Else 
     MessageBox.Show("erreur") 
    End If 

Lorsque le messagebox affich téléchargement succeful, je trouve le fichier dans mon répertoire d'application, mais je ne peux pas l'ouvrir, sa taille est 0KB

Index est la valeur rowSelected (en réseau)

Répondre

1

Puisque vous utilisez une méthode de téléchargement asynchrone d'abord, vous devez utiliser Await devant pour assurer la re Le principal de votre méthode s'exécute après le téléchargement. Cependant, vous n'avez pas fourni assez de code pour bien comprendre le processus de votre méthode et ce qui pourrait être faux.

Vous devez suivre ce modèle pour télécharger un fichier: https://developers.google.com/api-client-library/dotnet/guide/media_download

Voici un exemple et ne doit pas être pris littéralement. Vous voudrez ajouter des paramètres à la méthode pour remplir l'APP_NAME_HERE, BUCKET_HERE, OBJECT_HERE, FILE_PATH_HERE.

Public Shared Sub DownloadFile() 
    ' Create the service using the client credentials. 
    Dim storageService = New StorageService(New 
    BaseClientService.Initializer() With 
     { 
      .HttpClientInitializer = credential, 
      .ApplicationName = "APP_NAME_HERE" 
     }) 
    ' Get the client request object for the bucket and desired object. 
    Dim getRequest = storageService.Objects.Get("BUCKET_HERE", "OBJECT_HERE") 
    Using fileStream As New System.IO.FileStream(
     "FILE_PATH_HERE", 
     System.IO.FileMode.Create, 
     System.IO.FileAccess.Write) 
     ' Add a handler which will be notified on progress changes. 
     ' It will notify on each chunk download and when the 
     ' download is completed or failed. 
     AddHandler getRequest.MediaDownloader.ProgressChanged, AddressOf Download_ProgressChanged 
     getRequest.Download(fileStream) 
    End Using 
End Sub 

Private Shared Sub Download_ProgressChanged(IDownloadProgress progress) 
    Console.WriteLine(progress.Status & " " & progress.BytesDownloaded); 
End Sub 

Ceci est la méthode pour l'utilisation de l'API Google Cloud que vous utilisiez, mais vous plus probablement envie d'utiliser l'API Google Drive:

Imports System.Net 
Imports Google.Apis.Authentication 
Imports Google.Apis.Drive.v2 
Imports Google.Apis.Drive.v2.Data 

Public Class MyClass 

    ''' <summary> 
    ''' Download a file and return a stream with its content. 
    ''' </summary> 
    ''' <param name="authenticator"> 
    ''' Authenticator responsible for creating authorized web requests. 
    ''' </param> 
    ''' <param name="file">Drive File instance.</param> 
    ''' <returns>File's content if successful, null otherwise.</returns> 
    Public Shared Function System.IO.Stream DownloadFile(authenticator As IAuthenticator, webFile As File) 

     If Not String.IsNullOrEmpty(webFile.DownloadUrl) Then 
      Try 
       Dim request = WebRequest.Create(New Uri(webFile.DownloadUrl)) 
       authenticator.ApplyAuthenticationToRequest(request) 
       Dim response = request.GetResponse() 
       If response.StatusCode = HttpStatusCode.OK Then 
        Return response.GetResponseStream() 
       End If 

       Console.WriteLine("An error occurred: " & response.StatusDescription) 
       Return null 

      Catch (e as Exception) 
       Console.WriteLine("An error occurred: " & e.Message) 
       Return null 
      End Try 
     End If 

     ' The file doesn't have any content stored on Drive. 
     Return null; 
    End Function 
End Class 

Ce que vous avez est assez proche, ces les changements devraient le faire fonctionner.

Public Sub DownloadFile(service As DriveService, fileName As String, outputStream As Stream) 
    Dim list = service.Files.List().Execute() 
    Dim file = list.FirstOrDefault(Function(x) x.Title.Equals(fileName)) 
    If file Is Nothing Then 
     Console.WriteLine("File not found.") 
     Return 
    End If 
    Dim request = service.Files.Get(file.Id) 

    ' Add a handler which will be notified on progress changes. 
    ' It will notify on each chunk download and when the 
    ' download is completed or failed. 
    AddHandler request.MediaDownloader.ProgressChanged, 
      Sub(IDownloadProgress progress) 
       Select Case progress.Status 
        Case DownloadStatus.Downloading 
         Console.WriteLine(progress.BytesDownloaded) 

        case DownloadStatus.Completed 
         Console.WriteLine("Download complete.") 

        Case DownloadStatus.Failed: 
         Console.WriteLine("Download failed.") 

       End Select 
      End Sub 
     request.Download(outputStream); 
End Sub 
+0

qu'est-ce que c'est que BUCKET_HERE, OBJECT_HERE? –

+0

@ Zied.M Il s'agit des API Google Cloud que vous utilisez. Si vous voulez des données Google Drive, vous devez utiliser les autres API. – Jeremy

+0

J'utilise Google Drive API V2, je pense que ma méthode est correcte mais le résultat est faux, je ne comprends pas votre réponse. Merci –