Como implementar upload de arquivo para o AWS S3

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.

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 AWS S3.

  4. 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”.

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 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);
Substitua o valor das variáveis "accessKeyId" e "secretAccessKey" pelos valores correspondentes, obtidos na criação do usuário, no menu IAM do Console AWS.

Ú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.

3 curtidas

Que show!!:heart_eyes::heart_eyes::heart_eyes:

Obrigado por compartilhar @daniel.giacomelli !

1 curtida

Exclusão do Arquivo do S3

Na versão 1.1.0 da biblioteca LATROMI.Facades.AWS foi adicionado o método para Upload.

Segue um exemplo de código C# para efeturar a exclusão do arquivo do AWS:

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

var accessKeyId = "AKIAU.....";
var secretAccessKey = "/FG8Qz1M.....";

var fileToDelete = (string)Fields["file_to_delete"].Value;

// Carrega o assembly "LATROMI.Facades.AWS.dll" de forma "desconectada"
var assembly = LoadAssembly(@"C:\LATROMI\libs\latromi-facades\1.1.0\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"); 

// Faz a exclusão do arquivo
uploader.Delete(fileToDelete);    
1 curtida