Как загрузить файл на общий диск Google через Drive API в VB. Net? - PullRequest
1 голос
/ 20 июня 2020

Назначение заключалось в том, чтобы разрешить пользователям загружать документы в подпапку на общем диске Google через веб-сайт Asp. Net. Я могу загрузить на свой Google диск, но не могу загрузить на общий диск.

1 Ответ

0 голосов
/ 30 июня 2020

Идентификаторы папок и файлов находятся в конце URL-адреса на Google Диске.

    Private ReadOnly GoogleDriveScopes As String() = {DriveService.Scope.Drive}
    Private ReadOnly SharedDriveId As String = "{the ID for the shared drive goes here}"

    Private Function CreateGoogleDriveService() As DriveService
        Dim credential As GoogleCredential

        Using stream = New FileStream("credentials.json", FileMode.Open, FileAccess.Read)
            credential = GoogleCredential.FromStream(stream).CreateScoped(GoogleDriveScopes)
        End Using

        Return New DriveService(New BaseClientService.Initializer() With {
            .HttpClientInitializer = credential,
            .ApplicationName = "My App"
        })
    End Function

    Private Function CreateGoogleDriveFolder(service As DriveService, folderName As String) As String
        Dim fileMetadata = New Google.Apis.Drive.v3.Data.File() With {
            .Name = folderName,
            .MimeType = "application/vnd.google-apps.folder",
            .DriveId = SharedDriveId ,
            .Parents = New List(Of String)() From {
                    "{the ID of the sub folder goes here or remove parents if no sub folder}"
                }
        }

        Dim file = service.Files.Create(fileMetadata)
        file.Fields = "id"
        file.SupportsAllDrives = True
        Return file.Execute().Id
    End Function

    Private Function GetGoogleDriveFiles(service As DriveService, folderName As String) As List(Of Google.Apis.Drive.v3.Data.File)
        Dim files As List(Of Google.Apis.Drive.v3.Data.File) = New List(Of Google.Apis.Drive.v3.Data.File)()

        Dim listRequest As FilesResource.ListRequest = service.Files.List()
        listRequest.Q = "mimeType='application/vnd.google-apps.folder' and name = '" & folderName & "'"
        listRequest.Fields = "files(id, name)"
        listRequest.Corpora = "drive"
        listRequest.DriveId = SharedDriveId 
        listRequest.SupportsAllDrives = True
        listRequest.IncludeItemsFromAllDrives = True

        For Each file In listRequest.Execute().Files
            files.Add(file)
        Next

        Return files
    End Function

    Private Function GetGoogleDriveFolder(service As DriveService, folderName As String) As String
        Dim listRequest As FilesResource.ListRequest = service.Files.List()
        listRequest.Q = "mimeType='application/vnd.google-apps.folder'"
        listRequest.Fields = "files(id, name)"
        listRequest.Corpora = "drive"
        listRequest.DriveId = SharedDriveId 
        listRequest.SupportsAllDrives = True
        listRequest.IncludeItemsFromAllDrives = True

        Dim files As List(Of Google.Apis.Drive.v3.Data.File) = listRequest.Execute().Files
        If files IsNot Nothing Then
            Dim foundFolder As Google.Apis.Drive.v3.Data.File = files.Where(Function(w) w.Name = folderName).FirstOrDefault()

            If foundFolder IsNot Nothing Then
                Return foundFolder.Id
            End If
        End If

        Return CreateGoogleDriveFolder(service, folderName)
    End Function

    Private Function UploadFileToGoogleDrive(service As DriveService, filePath As HttpPostedFile) As Boolean
        Dim folderName As String = GetGoogleDriveFolder(service, Quote)

        If Not String.IsNullOrWhiteSpace(folderName) Then
            Try
                Dim fileMetadata As New Google.Apis.Drive.v3.Data.File With {
                       .Name = filePath.FileName,
                       .MimeType = filePath.ContentType,
                       .Parents = New List(Of String)() From {
                               folderName
                           }
                   }

                Dim mediaUpload As FilesResource.CreateMediaUpload = service.Files.Create(fileMetadata, filePath.InputStream, filePath.ContentType)
                mediaUpload.SupportsAllDrives = True
                mediaUpload.Upload()
                Return True
            Catch ex As Exception
                Throw ex
            End Try
        End If

        Return False
    End Function

    Protected Sub UploadDocumentButton_Click(sender As Object, e As EventArgs) Handles UploadDocumentButton.Click
        If FileUpload1.HasFiles AndAlso Not String.IsNullOrEmpty(Quote) Then
            Dim service = CreateGoogleDriveService()

            For Each myFile As HttpPostedFile In FileUpload1.PostedFiles
                If myFile.ContentLength > 0 Then
                    Try
                        If UploadFileToGoogleDrive(service, myFile) Then
                            lblGoogleDriveMessage.Text = "File uploaded to Google Drive"
                        End If
                    Catch ex As Exception
                        lblGoogleDriveMessage.Text = ex.Message
                        Return
                    End Try
                End If
            Next
        End If
    End Sub

учетные данные. json файл (... замените учетными данными вашей учетной записи)

{
  "type": "service_account",
  "project_id": " ... ",
  "private_key_id": " ... ",
  "private_key": "-----BEGIN PRIVATE KEY-----\n ... \n-----END PRIVATE KEY-----\n",
  "client_email": " ... .gserviceaccount.com",
  "client_id": " ... ",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/ ... .gserviceaccount.com"
}
...