CloudAPI – Envio de arquivos para Amazon S3 e Windows Azure – Parte 2
Nesta segunda e última parte do artigo sobre envio de arquivos para as nuvens vamos detalhar como funciona o envio de arquivos para o para Amazon S3.
Você pode ler os artigos que antecedem estas sequência nos links abaixo, é importante ler estes artigos para melhor entendimento deste artigo:
- Shell Extension para Windows 32-bt and 64-bit com Delphi XE2
- CloudAPI – Envio de arquivos para Amazon S3 e Windows Azure – Parte 1
Na primeira parte do artigo descrevo como obter sua conta no Amazon e os significados do Bucket e Blog, considerando que você leu os artigos anteriores nos resta saber como funciona o CloudAPI para envio de arquivos para o Amazon S3, que é bem parecido ao do Windows Azure.
Envio de arquivos para Amazon S3
A implementação do Shell Extension utiliza o método UploadtoAmazon (CloudDM.pas) para o envio de arquivos para o Amazon S3, antes de enviar o arquivo temos definir em qual pasta (Bucket) será armazenado este arquivo.
Como o bucket pode não existir, ou o usuário pode querer criar um novo, implementei um formulário que permite o usuário selecionar um bucket já existente ou criar um novo.
Abaixo parte do código responsável pelo envio do arquivo, as linhas em destaque refletem o código que irá listar e criar ou selecionar o bucket.
Ao fazer uma solicitação ao Amazon S3 através do CloudAPI a maioria dos métodos retorna um objeto do tipo TCloudResponseInfo, este objeto contém o status do retorno referente a sua solicitação, todas estas solicitações são chamadas REST.
Para obter a lista de buckets utilizamos o método ListBuckets que é parte do objeto StorageService instanciando anteriormente, todos os serviços relacionados a Storage fazem parte desta classe, assim como a criação do bucket através do método CreateBucket.
Amazon e Windows Azure diferem no que diz respeito ao suporte a metadata na criação do container/bucket, Amazon não suporta metadata enquanto Windows Azure sim.
function TCloud.UploadtoAmazon(FileName: String): TCloudResponseInfo; var StorageService: TAmazonStorageService; BucketList, Metadata: TStrings; Content: TBytes; ResponseList: TCloudResponseInfo; FrmList: TFrmContainerList; Act: TContainerAction; BucketName: String; I: Integer; begin Result := TCloudResponseInfo.Create; if (FileName = EmptyStr) then Exit; StorageService := TAmazonStorageService.Create(AmazonConnection); {$REGION 'Define the Bucket'} ResponseList := TCloudResponseInfo.Create; BucketList := StorageService.ListBuckets(ResponseList); if ResponseList.StatusCode = 200 then begin // Amazon return date/time information for each Bucket // this for is required to remove that information for I := 0 to BucketList.Count - 1 do BucketList[I] := BucketList.Names[I]; FrmList := TFrmContainerList.Create(nil, BucketList, TClouds[AmazonIndex]); try FrmList.ShowModal; Act := FrmList.Action; case Act of caCreate: begin if StorageService.CreateBucket(FrmList.Container, amzbaNotSpecified, amzrNotSpecified, Result) then BucketName := FrmList.Container; end; caUpload: begin BucketName := FrmList.Container; end; end; finally FrmList.Free; end; if Act = TContainerAction.caNone then Exit; end;
Com o bucket definido podemos adiante e preparar o envio do arquivo.
Para o envio do arquivo utilizamos o método StorageService.UploadObject que contém diversos parâmetros como: nome e o conteúdo do arquivo em TBytes, metadata e alguns outros que não são necessários para este exemplo. Você deve utilizar alguma função para fazer o encode do nome do arquivo, por exemplo TIdURI.URLEncode(str).
Podemos adicionar metadata ao arquivo, neste exemplo adiciono o nome do computador\usuário e a localização original do arquivo a ser enviado.
Metadata.Clear; Metadata.Values[SMDPath] := ExtractFilePath(FileName); Metadata.Values[SMDFrom] := GetComputerandUserName; Content := ContentOf(FileName); BlobName := ExtractFileName(FileName);
O método ContentOf retorna o conteúdo do arquivo em TBytes.
function TCloud.ContentOf(const FileName: String; RequiredSizeMod: Integer): TBytes; var fs: TFileStream; begin if FileName <> EmptyStr then begin fs := TFileStream.Create(FileName, fmOpenRead); try if RequiredSizeMod < 1 then SetLength(Result, fs.Size) else SetLength(Result, ((fs.Size div RequiredSizeMod) + 1) * RequiredSizeMod); fs.ReadBuffer(Result[0], fs.Size); finally fs.Free; end; end else SetLength(Result, 0); end;
O resultado do envio será um parâmetro de saída do tipo TCloudResponseInfo, este contém a propriedade StatusCode, requisições realizadas com sucesso retornam o código 200 ou 201.
StorageService.UploadObject(BucketName, ExtractFileName(FileName), Content, False, Metadata, nil, amzbaPublicRead, Result); ShowResponseInfo(TClouds[AmazonIndex], Result);
Clique aqui para visualizar o código fonte da unit CloudDM.pas.
O código fonte completo está disponível no repositório do RAD Studio XE2 no sourceforge e as informações para efetuar o download dos fontes completo estão disponíveis aqui.
Nesta sequência de artigos você pode aprender a criar Shell Extensions, compilar pra 32-bit e 64 bit e utilizar o CloudAPI, vale lembrar que o ClouAPI traz muitas outras API’s para interagir com as nuvens
Trackbacks & Pingbacks
[…] Fonte: Andreano Lanusse […]
Deixe uma resposta
Want to join the discussion?Feel free to contribute!