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 AWS S3, 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 AWS S3.
-
Por fim, o arquivo será excluído do diretório temporário.
Formulário
Consumir as APIs do AWS S3 do lado do servidor exige alguma complexidade em função da criptografia envolvida. Por este motivo, usaremos a biblioteca .NET do AWS S3 desenvolvida pela própria AWS.
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 AWS S3 em um projeto independente, do tipo Class Library do Visual Studio, chamado LATROMI.Facades.AWS. 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 a “Key” dos arquivos enviados para o AWS S3, separados por “,”. Você pode usar essa variável para salvar as “Keys” 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 AWS S3. Vou chamar este procedimento de AWSS3Upload.
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;
var accessKeyId = "AKIAU.....";
var secretAccessKey = "/FG8Qz1M.....";
var folder = @"C:\Temp\uploads\" + (string)Variables["v_working_folder"].Value;
// Carrega o assembly "LATROMI.Facades.AWS.dll" de forma "desconectada"
var assembly = LoadAssembly(@"C:\LATROMI\libs\latromi-facades\LATROMI.Facades.AWS.dll");
// Cria instância de "AWSS3Uploader"
dynamic uploader = Activator.CreateInstance(
assembly.GetType("LATROMI.Facades.AWS.AWSS3Uploader")
);
// Credenciais, Bucket e Região
uploader.SetCredenditals(accessKeyId, secretAccessKey);
uploader.SetBucket("nome-do-seu-bucket");
// Informe aqui o nome da sua região
uploader.SetRegion("us-east-2");
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 as "Keys" dos arquivos no campo de resultado
Fields["result"].Value = string.Join(",", fileIdList);
Última etapa
Por fim, basta chamar a ação “Confirmar Uploads” e em seguida chamar o procedimento “AWSS3Upload”.
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.