Como implementar upload de arquivo para o Google Drive

Visão Geral

Atualmente, o Latromi possui 3 destinos para upload de arquivos:

  • Diretório do servidor
  • FTP
  • Banco de dados

Neste tópico vamos descobrir como podemos implementar o upload de arquivos para o Google Drive, usando códigos C# do Formulário.

image

A Implementação vai funcionar da seguinte maneira:

  1. Quando o Formulário for carregado, um diretório temporário será criado no servidor para hospedar os arquivos.

  2. Quando o usuário realizar o upload do arquivo, este arquivo será confirmado e enviado para o diretório do servidor (que definimos no passo anterior).

  3. Em seguida, vamos chamar um código C# que vai fazer a leitura do arquivo e transferi-lo para o Google Drive.

  4. Por fim, o arquivo será excluído do diretório temporário.

Configuração do Google

Antes de começarmos, precisamos fazer as configurações necessárias na sua conta do Google.

Google Cloud

Criando a Conta de Serviço

A conta de serviço será usada para fazermos a autenticação no Google Drive, sem a necessidade de implementarmos toda a dinâmica do protocolo OAuth2.

Siga os passos a seguir para criar uma Conta de Serviço do Google:

  1. Abra sua conta no Google Cloud, e acesse o menu IAM e
    Administrador
    IAM

  2. Nas opções que aparecem à esquerda, clique em Contas de Serviço.

  3. Clique no botão Criar conta de serviço.

  4. Preencha o nome da conta, e no Papel, escolha a opção Editor.

Criando a Chave

Agora precisamos gerar uma chave para realizar a autenticação da conta de serviço criada. Para isso, siga os próximos passos:

  1. Selecione a conta criada, clique no ícone à direita, e em seguida clique em Gerenciar Chaves.

  2. Na tela a seguir, clique em Adicionar ChaveCriar Nova Chave.

  3. Selecione a opção “JSON” e clique no botão Criar.

    image

  4. Um arquivo com extensão .json será baixado no seu computador. Usaremos este arquivo no código C# do Formúlário.

Por fim, copie o E-mail gerado para o usuário de serviço. Vamos precisa dele para conceder as persmissões no Google Drive.

Exemplo: teste-google-drive@latromi-dev.iam.gserviceaccount.com

Google Drive

Compartilhando a Pasta

Acesse o Google Drive, e navegue até a pasta onde deseja armazenar os arquivos. Clique nas Configurações de Compartilhamento, e adicione o e-mail da conta de serviço do Google Cloud, com papel de “Administrador de Conteúdo”.

image

Formulário

Consumir as APIs do Google do lado do servidor exige alguma complexidade em função da criptografia envolvida. Por este motivo, usaremos a biblioteca .NET do Google Drive desenvolvida pelo próprio Google.

DLL .NET

Para facilitar o uso da biblioteca (que precisa ser referenciada no projeto), encapsulamos o código C# que vai fazer o Upload para o Google Drive em um projeto independente, do tipo Class Library do Visual Studio, chamado LATROMI.Facades.GoogleDrive. Chamaremos a DLL gerada por este projeto de dentro do Formulário do Latromi.

Você pode conferir o código fonte completo desta DLL no Github da Latromi.

Baixe os arquivos de distribuição mais recentes do projeto neste link, e faça a extração dos arquivo em uma pasta do servidor.

Neste exemplo, a pasta onde extraí os arquivos foi “C:\LATROMI\libs\latromi-facades”.

Não se esqueça de manter todos os arquivos extraídos na pasta.

Variáveis

v_working_folder

Essa variável vai receber um texto aleatório para ser usado como nome de pasta temporária.

Utilize o evento “Load” do Formulário para preenche-la usando a ação “Popular Campos e Variáveis”. No exemplo a seguir, vamos preencher um valor aletório do tipo UUID, via C#:

Informe o código C# abaixo:

return Guid.NewGuid().ToString("N");

v_result

Essa variável vai receber uma lista com ID dos arquivos enviados para o Google Drive, separados por “,”. Você pode usar essa variável para salvar os IDs no banco de dados.

Campos

Adicione um campo do tipo “Upload”, configure a propriedade “Destino” como “Diretório” e informe um caminho conforme o exemplo a abaixo, usando a variável “v_working_folder”:

C:\Temp\uploads{?VAR.v_working_folder}

Procedimentos

Adicione um novo Procedimento, cuja função será consumir a DLL que mencionamos anteriormente (projeto do Github).

A função deste Procedimento será pegar o arquivo que foi enviado para a pasta temporária e transferindo-o para o Google Drive. Vou chamar este procedimento de GoogleDriveUpload.

Adicione uma ação do tipo “Exceutar código C#” e informe o código a seguir:

using System;
using System.IO;
using System.Reflection;
using Newtonsoft.Json;

// Diretório temporário, para onde o arquivo foi enviado
var folder = @"C:\Temp\uploads\" + (string)Variables["v_working_folder"].Value;

// Carrega o assembly "LATROMI.Facades.GoogleDrive.dll" de forma "desconectada"
var assembly = LoadAssembly(@"C:\LATROMI\libs\latromi-facades\LATROMI.Facades.GoogleDrive.dll");

// Cria dinâmicamente uma instância de "GoogleDriveUploader"
dynamic uploader = Activator.CreateInstance(
    assembly.GetType("LATROMI.Facades.GoogleDrive.GoogleDriveUploader")
    );

// Carrega o arquivo JSON com as credenciais da Conta de Serviço
uploader.LoadCredentialFromFile(@"C:\LATROMI\libs\latromi-dev-769bf3304165.json");

// ID da pasta do Google Drive, onde o arquivo será alocado
uploader.SetFolder("123X9IYCdH-vd88RsH80LlHN221wnftFe");

var fileIdList = new List<string>();
foreach(string filePath in Directory.GetFiles(folder))
{
    // Faz o upload do arquivo, e retorna o ID
    string fileId = uploader.UploadFromFile(filePath);    
    
    fileIdList.Add(fileId);
    
    // Exclui o arquivo do diretório 
    // quando o upload for concluído.
    File.Delete(filePath);
}

// Coloca os IDs dos arquivos no campo de resultado
Variables["v_result"].Value = string.Join(",", fileIdList);
Perceba que estamos utilizando o arquivo com as credenciais da conta de serviço do Google, ao chamar o método "uploader.LoadCredentialFromFile(...)". Tenha cuidado para manter este arquivo protegido.

Se preferir, você pode carregar este JSON diretamente do banco de dados, e informálo através do método “uploader.LoadCredentialFromJson(…)”

Última etapa

Por fim, basta chamar a ação “Confirmar Uploads” e em seguida chamar o procedimento “GoogleDriveUpload”.

Você pode fazer isso no ponto onde for mais conveniente para sua rotina. No meu exemplo, estou fazendo no evento “FileUploaded” do campo do tipo Upload.

1 curtida

Bah! Que show!! :heart_eyes: :heart_eyes: :heart_eyes:
Muito bom poder executar código C# sempre que necessário na plataforma Latromi!
Arrasou @daniel.giacomelli !!! :clap: :clap: :clap:

1 curtida