PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 25 → Amazon S3 - mais conhecido como Balde da Amazon integrando com WLanguage
Amazon S3 - mais conhecido como Balde da Amazon integrando com WLanguage
Started by Boller, Oct., 14 2024 7:06 PM - No answer
Registered member
3,774 messages
Posted on October, 14 2024 - 7:06 PM
Prezados,

Segue abaixo um material de estudo do S3 da Amazon:

Esse artigo é sobre o upload eficiente de arquivos para o Amazon S3, podemos aplicar os conceitos no contexto do WLanguage para implementar uma solução que trabalhe com o S3. O artigo aborda métodos como multipart upload para grandes arquivos, o que pode ser adaptado para o WLanguage usando bibliotecas HTTP e operações assíncronas.

A seguir, vamos construir um exemplo de código para realizar uploads de arquivos para o Amazon S3 de maneira eficiente, utilizando WLanguage.

Exemplo em WLanguage para upload de arquivos ao Amazon S3

1. Pré-requisitos

• Credenciais AWS: Você precisará de uma Access Key e Secret Key para se autenticar com o serviço S3 da Amazon.
• Bucket S3: Um bucket previamente configurado no S3 onde os arquivos serão enviados.

2. Dependências

Para enviar arquivos para o S3, usaremos as funções HTTP nativas do WLanguage e, opcionalmente, o uso de Multipart Upload para uploads grandes.

Classe S3Uploader em WLanguage

CLASS S3Uploader
// Atributos para armazenar as credenciais e o bucket S3
s3AccessKey é string
s3SecretKey é string
s3BucketName é string
s3Region é string

// Construtor para inicializar a classe com credenciais
CONSTRUCTOR(S3AccessKey é string, S3SecretKey é string, S3BucketName é string, S3Region é string)
s3AccessKey = S3AccessKey
s3SecretKey = S3SecretKey
s3BucketName = S3BucketName
s3Region = S3Region
END

// Função para gerar a URL do S3
PROCEDURE GenerateS3URL(ObjectKey é string) RETORNA string
RETURN "https://" + s3BucketName + ".s3." + s3Region + ".amazonaws.com/" + ObjectKey
END

// Função para realizar o upload do arquivo para o S3
PROCEDURE UploadFileToS3(FilePath é string, ObjectKey é string) RETORNA booleano
s3URL é string
HTTPResponse é httpRequest
FileBinaryContent é buffer
AuthorizationHeader é string
DateHeader é string = DateSys() + "T" + TimeSys() + "Z"

// Gera a URL do S3 para o upload
s3URL = GenerateS3URL(ObjectKey)

// Lê o conteúdo do arquivo
FileBinaryContent = fLoadBuffer(FilePath)

// Cria o cabeçalho de autorização para autenticação com S3
AuthorizationHeader = GenerateAuthorizationHeader(ObjectKey, FileBinaryContent, DateHeader)

// Envia o arquivo usando HTTP POST
HTTPResponse = HTTPRequest(s3URL, httpPost, FileBinaryContent, AuthorizationHeader)

// Verifica se o upload foi bem-sucedido
SE HTTPResponse.StatusCode = 200 ENTÃO
RESULTADO Verdadeiro
SENÃO
RESULTADO Falso
FIM
END

// Função para gerar o cabeçalho de autorização
PROCEDURE GenerateAuthorizationHeader(ObjectKey é string, Content é buffer, DateHeader é string) RETORNA string
// Esta função deve gerar a assinatura necessária para autenticação com o AWS S3
// O processo envolve a criação de uma assinatura HMAC-SHA256 com as credenciais da AWS.
// (Simplificado para fins de exemplo)
LOCAL Signature é string
Signature = HMACSHA256(s3SecretKey, ObjectKey + DateHeader)
RETURN "AWS " + s3AccessKey + ":" + Signature
END
END

Exemplo de uso da classe S3Uploader

// Credenciais da AWS (inserir suas próprias credenciais)
AWSAccessKey é string = "SEU_ACCESS_KEY"
AWSSecretKey é string = "SEU_SECRET_KEY"
AWSBucket é string = "seu-bucket"
AWSRegion é string = "us-east-1"

// Caminho do arquivo local e o nome do arquivo no S3
FilePath é string = "C:\Caminho\Para\SeuArquivo.txt"
ObjectKey é string = "uploads/SeuArquivo.txt"

// Instanciando o uploader S3
mS3Uploader é S3Uploader(AWSAccessKey, AWSSecretKey, AWSBucket, AWSRegion)

// Realizando o upload
SE mS3Uploader.UploadFileToS3(FilePath, ObjectKey) ENTÃO
Info("Upload para o S3 realizado com sucesso!")
SENÃO
Error("Falha no upload para o S3.")
FIM

Explicação:

1. Classe S3Uploader:
• A classe gerencia a autenticação com o Amazon S3 e realiza o upload do arquivo.
• O método UploadFileToS3 envia o arquivo para o bucket S3 usando uma requisição HTTP POST.
• O cabeçalho de autorização é gerado utilizando a chave secreta e a chave de acesso da AWS.
2. Autenticação com S3:
• O método GenerateAuthorizationHeader cria uma assinatura para autenticar a requisição com S3, utilizando HMAC-SHA256.
• Essa assinatura é necessária para que o S3 reconheça a requisição como válida.
3. Upload multipart (não implementado neste exemplo):
• Se você está lidando com arquivos muito grandes, pode implementar o multipart upload, que divide o arquivo em partes e faz upload de cada uma separadamente. Isso pode ser feito usando uma abordagem semelhante, onde o arquivo é dividido em buffers menores e cada parte é enviada.

Conclusão:

Este exemplo mostra como fazer o upload de arquivos para o Amazon S3 usando WLanguage. Ele foi adaptado do artigo original sobre métodos eficientes de upload para S3 e inclui autenticação com AWS usando as credenciais de acesso. Em projetos maiores, você pode expandir essa classe para suportar mais funcionalidades, como uploads multipart, gerenciamento de erros detalhado e mais tipos de requisições (como PUT e DELETE).


Aqui está um novo exemplo de upload de arquivos para o Amazon S3 utilizando WLanguage, com uma abordagem mais prática e detalhada, incluindo o uso de uploads multipart para arquivos grandes, o que torna o processo mais eficiente.

Exemplo em WLanguage para upload multipart para o Amazon S3

Pré-requisitos:

• Credenciais AWS: Você precisará das chaves de acesso da AWS (Access Key e Secret Key).
• Bucket S3: Um bucket já configurado no S3.

Classe S3MultipartUploader

CLASS S3MultipartUploader
s3AccessKey é string
s3SecretKey é string
s3BucketName é string
s3Region é string

// Construtor
CONSTRUCTOR(S3AccessKey é string, S3SecretKey é string, S3BucketName é string, S3Region é string)
s3AccessKey = S3AccessKey
s3SecretKey = S3SecretKey
s3BucketName = S3BucketName
s3Region = S3Region
END

// Função para gerar a URL do S3
PROCEDURE GenerateS3URL(ObjectKey é string) RETORNA string
RETURN "https://" + s3BucketName + ".s3." + s3Region + ".amazonaws.com/" + ObjectKey
END

// Função para iniciar o upload multipart
PROCEDURE StartMultipartUpload(ObjectKey é string) RETORNA string
LOCAL s3URL é string
LOCAL HTTPResponse é httpRequest
LOCAL UploadID é string
LOCAL AuthorizationHeader é string
LOCAL DateHeader é string = DateSys() + "T" + TimeSys() + "Z"

s3URL = GenerateS3URL(ObjectKey) + "?uploads"
AuthorizationHeader = GenerateAuthorizationHeader(ObjectKey, "", DateHeader)

// Inicia o upload multipart
HTTPResponse = HTTPRequest(s3URL, httpPost, "", AuthorizationHeader)

// Verifica se a requisição foi bem-sucedida
SE HTTPResponse.StatusCode = 200 ENTÃO
// Extrai o UploadID do XML de resposta
UploadID = XMLExtractUploadID(HTTPResponse.Content)
RESULTADO UploadID
SENÃO
RESULTADO ""
FIM
END

// Função para enviar uma parte do arquivo
PROCEDURE UploadPart(FilePart é buffer, ObjectKey é string, UploadID é string, PartNumber é inteiro) RETORNA booleano
LOCAL s3URL é string
LOCAL HTTPResponse é httpRequest
LOCAL AuthorizationHeader é string
LOCAL DateHeader é string = DateSys() + "T" + TimeSys() + "Z"

s3URL = GenerateS3URL(ObjectKey) + "?partNumber=" + NumToString(PartNumber) + "&uploadId=" + UploadID
AuthorizationHeader = GenerateAuthorizationHeader(ObjectKey, FilePart, DateHeader)

// Envia a parte do arquivo
HTTPResponse = HTTPRequest(s3URL, httpPut, FilePart, AuthorizationHeader)

// Verifica se o upload da parte foi bem-sucedido
SE HTTPResponse.StatusCode = 200 ENTÃO
RESULTADO Verdadeiro
SENÃO
RESULTADO Falso
FIM
END

// Função para finalizar o upload multipart
PROCEDURE CompleteMultipartUpload(ObjectKey é string, UploadID é string) RETORNA booleano
LOCAL s3URL é string
LOCAL HTTPResponse é httpRequest
LOCAL AuthorizationHeader é string
LOCAL DateHeader é string = DateSys() + "T" + TimeSys() + "Z"

s3URL = GenerateS3URL(ObjectKey) + "?uploadId=" + UploadID
AuthorizationHeader = GenerateAuthorizationHeader(ObjectKey, "", DateHeader)

// Finaliza o upload multipart
HTTPResponse = HTTPRequest(s3URL, httpPost, "", AuthorizationHeader)

// Verifica se a finalização foi bem-sucedida
SE HTTPResponse.StatusCode = 200 ENTÃO
RESULTADO Verdadeiro
SENÃO
RESULTADO Falso
FIM
END

// Função para gerar o cabeçalho de autorização
PROCEDURE GenerateAuthorizationHeader(ObjectKey é string, Content é buffer, DateHeader é string) RETORNA string
LOCAL Signature é string
Signature = HMACSHA256(s3SecretKey, ObjectKey + DateHeader)
RETURN "AWS " + s3AccessKey + ":" + Signature
END

// Função para extrair o UploadID da resposta XML
PROCEDURE XMLExtractUploadID(ResponseXML é string) RETORNA string
// Simplificado: busca e extrai o UploadID no XML retornado
// Aqui utilizamos uma função de parsing XML ou regex para extrair o ID
RESULTADO ExtrairelementoXML(ResponseXML, "UploadId")
END
END


Exemplo de uso da classe S3MultipartUploader, este exemplo faz o upload de um arquivo dividido em partes.

// Credenciais da AWS
AWSAccessKey é string = "SEU_ACCESS_KEY"
AWSSecretKey é string = "SEU_SECRET_KEY"
AWSBucket é string = "seu-bucket"
AWSRegion é string = "us-east-1"

// Caminho do arquivo local e o nome do arquivo no S3
FilePath é string = "C:\Caminho\Para\SeuArquivoGrande.txt"
ObjectKey é string = "uploads/SeuArquivoGrande.txt"

// Instancia o uploader multipart
mS3Uploader é S3MultipartUploader(AWSAccessKey, AWSSecretKey, AWSBucket, AWSRegion)

// Inicia o upload multipart
UploadID é string = mS3Uploader.StartMultipartUpload(ObjectKey)

SE UploadID = "" ENTÃO
Error("Falha ao iniciar o upload multipart.")
SENÃO
// Divide o arquivo em partes e faz o upload
FileContent é buffer = fLoadBuffer(FilePath)
FileSize é inteiro = Length(FileContent)
PartSize é inteiro = 5 * 1024 * 1024 // Tamanho de cada parte: 5 MB
TotalParts é inteiro = IntegerDivision(FileSize, PartSize) + 1

PARA PartNumber = 1 ATÉ TotalParts
// Calcula o tamanho da parte e o conteúdo da parte
Start é inteiro = (PartNumber - 1) * PartSize + 1
Part é buffer = Extract(FileContent, Start, PartSize)

SE mS3Uploader.UploadPart(Part, ObjectKey, UploadID, PartNumber) = Falso ENTÃO
Error("Falha no upload da parte " + NumToString(PartNumber))
RETORNA
FIM
FIM

// Completa o upload multipart
SE mS3Uploader.CompleteMultipartUpload(ObjectKey, UploadID) ENTÃO
Info("Upload multipart para o S3 concluído com sucesso!")
SENÃO
Error("Falha ao finalizar o upload multipart.")
FIM
FIM

Explicação:

1. Iniciar o Upload Multipart:
• A função StartMultipartUpload inicia o processo de upload multipart no S3 e retorna um UploadID que será usado para as partes subsequentes.
2. Enviar cada parte:
• O arquivo é dividido em partes de 5 MB usando a função Extract. Cada parte é enviada para o S3 com a função UploadPart.
3. Completar o Upload:
• Quando todas as partes são enviadas, chamamos a função CompleteMultipartUpload para finalizar o upload no S3.

Conclusão:

Este exemplo mostra como realizar um upload eficiente de arquivos grandes para o Amazon S3 usando WLanguage com multipart upload, seguindo as melhores práticas. O uso de uploads multipart torna o processo mais robusto e escalável, especialmente para arquivos de grande tamanho.

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/