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.
A Implementação vai funcionar da seguinte maneira:
-
Quando o Formulário for carregado, um diretório temporário será criado no servidor para hospedar os arquivos.
-
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).
-
Em seguida, vamos chamar um código C# que vai fazer a leitura do arquivo e transferi-lo para o Google Drive.
-
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:
-
Abra sua conta no Google Cloud, e acesse o menu IAM e
Administrador → IAM -
Nas opções que aparecem à esquerda, clique em Contas de Serviço.
-
Clique no botão Criar conta de serviço.
-
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:
-
Selecione a conta criada, clique no ícone ⋮ à direita, e em seguida clique em Gerenciar Chaves.
-
Na tela a seguir, clique em Adicionar Chave → Criar Nova Chave.
-
Selecione a opção “JSON” e clique no botão Criar.
-
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”.
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”.
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);
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.