{"id":1398,"date":"2011-10-26T14:31:27","date_gmt":"2011-10-26T21:31:27","guid":{"rendered":"http:\/\/www.andreanolanusse.com\/pt\/?p=1398"},"modified":"2013-05-21T20:49:06","modified_gmt":"2013-05-22T03:49:06","slug":"cloudapi-envio-de-arquivos-para-amazon-s3-e-windows-azure-parte-2","status":"publish","type":"post","link":"http:\/\/www.andreanolanusse.com\/pt\/cloudapi-envio-de-arquivos-para-amazon-s3-e-windows-azure-parte-2\/","title":{"rendered":"CloudAPI \u2013 Envio de arquivos para Amazon S3 e Windows Azure \u2013 Parte 2"},"content":{"rendered":"<p>Nesta segunda e \u00faltima parte do artigo sobre envio de arquivos para as nuvens vamos detalhar como funciona o envio de arquivos para o para Amazon S3.<\/p>\n<p>Voc\u00ea pode ler os artigos que antecedem estas sequ\u00eancia nos links abaixo, \u00e9 importante ler estes artigos para melhor entendimento deste artigo:<\/p>\n<ul>\n<li><a title=\"Shell Extension para Windows 32-bit e 64-bit com Delphi XE2\" href=\"http:\/\/www.andreanolanusse.com\/pt\/shell-extension-para-windows-32-bit-e-64-bit-com-delphi-xe2\/\" target=\"_blank\">Shell Extension para Windows 32-bt and 64-bit com Delphi XE2<\/a><\/li>\n<li><a title=\"CloudAPI \u2013 Envio de arquivos para Amazon S3 e Windows Azure \u2013 Parte 1\" href=\"http:\/\/www.andreanolanusse.com\/pt\/cloudapi-envio-de-arquivos-para-amazon-s3-e-windows-azure-parte-1\/\" target=\"_blank\">CloudAPI \u2013 Envio de arquivos para Amazon S3 e Windows Azure \u2013 Parte 1<\/a><\/li>\n<\/ul>\n<p>Na primeira parte do artigo descrevo como obter sua conta no Amazon e os significados do Bucket e Blog, considerando que voc\u00ea leu os artigos anteriores nos resta saber como funciona o CloudAPI para envio de arquivos para o Amazon S3, que \u00e9 bem parecido ao do Windows Azure.<\/p>\n<h3>Envio de arquivos para Amazon S3<\/h3>\n<p>A implementa\u00e7\u00e3o do Shell Extension utiliza o m\u00e9todo UploadtoAmazon (CloudDM.pas) para o envio de arquivos para o Amazon S3, antes de enviar o arquivo temos definir em qual pasta (Bucket) ser\u00e1 armazenado este arquivo.<\/p>\n<p>Como o bucket pode n\u00e3o existir, ou o usu\u00e1rio pode querer criar um novo, implementei um formul\u00e1rio que permite o usu\u00e1rio selecionar um bucket j\u00e1 existente ou criar um novo.<\/p>\n<p>Abaixo parte do c\u00f3digo respons\u00e1vel pelo envio do arquivo, as linhas em destaque refletem o c\u00f3digo que ir\u00e1 listar e criar ou selecionar o bucket.<\/p>\n<p>Ao fazer uma solicita\u00e7\u00e3o ao Amazon S3 atrav\u00e9s do CloudAPI a maioria dos m\u00e9todos retorna um objeto do tipo TCloudResponseInfo, este objeto cont\u00e9m o status do retorno referente a sua solicita\u00e7\u00e3o, todas estas solicita\u00e7\u00f5es s\u00e3o chamadas REST.<\/p>\n<p>Para obter a lista de buckets utilizamos o m\u00e9todo ListBuckets que \u00e9 parte do objeto StorageService instanciando anteriormente, todos os servi\u00e7os relacionados a Storage fazem parte desta classe, assim como a cria\u00e7\u00e3o do bucket atrav\u00e9s do m\u00e9todo CreateBucket.<\/p>\n<p>Amazon e Windows Azure diferem no que diz respeito ao suporte a metadata na cria\u00e7\u00e3o do container\/bucket, Amazon n\u00e3o suporta metadata enquanto Windows Azure sim.<\/p>\n<pre class=\"brush: delphi\">function TCloud.UploadtoAmazon(FileName: String): TCloudResponseInfo;\r\nvar\r\n  StorageService: TAmazonStorageService;\r\n  BucketList, Metadata: TStrings;\r\n  Content: TBytes;\r\n  ResponseList: TCloudResponseInfo;\r\n  FrmList: TFrmContainerList;\r\n  Act: TContainerAction;\r\n  BucketName: String;\r\n  I: Integer;\r\nbegin\r\n  Result := TCloudResponseInfo.Create;\r\n\r\n  if (FileName = EmptyStr) then\r\n    Exit;\r\n\r\n  StorageService := TAmazonStorageService.Create(AmazonConnection);\r\n\r\n{$REGION 'Define the Bucket'}\r\n  ResponseList := TCloudResponseInfo.Create;\r\n  BucketList := StorageService.ListBuckets(ResponseList);\r\n\r\n  if ResponseList.StatusCode = 200 then\r\n  begin\r\n\r\n    \/\/ Amazon return date\/time information for each Bucket\r\n    \/\/ this for is required to remove that information\r\n    for I := 0 to BucketList.Count - 1 do\r\n      BucketList[I] := BucketList.Names[I];\r\n\r\n    FrmList := TFrmContainerList.Create(nil, BucketList, TClouds[AmazonIndex]);\r\n    try\r\n      FrmList.ShowModal;\r\n      Act := FrmList.Action;\r\n\r\n      case Act of\r\n        caCreate:\r\n          begin\r\n            if StorageService.CreateBucket(FrmList.Container, amzbaNotSpecified,\r\n              amzrNotSpecified, Result) then\r\n              BucketName := FrmList.Container;\r\n          end;\r\n        caUpload:\r\n          begin\r\n            BucketName := FrmList.Container;\r\n          end;\r\n      end;\r\n    finally\r\n      FrmList.Free;\r\n    end;\r\n\r\n    if Act = TContainerAction.caNone then\r\n      Exit;\r\n\r\n  end;<\/pre>\n<p>&nbsp;<\/p>\n<p>Com o bucket definido podemos adiante e preparar o envio do arquivo.<\/p>\n<p>Para o envio do arquivo utilizamos o m\u00e9todo StorageService.UploadObject que cont\u00e9m diversos par\u00e2metros como: nome e o conte\u00fado do arquivo em TBytes, metadata e alguns outros que n\u00e3o s\u00e3o necess\u00e1rios para este exemplo. Voc\u00ea deve utilizar alguma fun\u00e7\u00e3o para fazer o encode do nome do arquivo, por exemplo\u00a0\u00a0TIdURI.URLEncode(str).<\/p>\n<p>Podemos adicionar metadata ao arquivo, neste exemplo adiciono o nome do computador\\usu\u00e1rio e a localiza\u00e7\u00e3o original do arquivo a ser enviado.<\/p>\n<pre class=\"brush: delphi\">    Metadata.Clear;\r\n    Metadata.Values[SMDPath] := ExtractFilePath(FileName);\r\n    Metadata.Values[SMDFrom] := GetComputerandUserName;\r\n\r\n    Content := ContentOf(FileName);\r\n    BlobName := ExtractFileName(FileName);<\/pre>\n<p>O m\u00e9todo ContentOf retorna o conte\u00fado do arquivo em TBytes.<\/p>\n<pre class=\"brush: delphi\">function TCloud.ContentOf(const FileName: String;\r\n  RequiredSizeMod: Integer): TBytes;\r\nvar\r\n  fs: TFileStream;\r\nbegin\r\n  if FileName &lt;&gt; EmptyStr then\r\n  begin\r\n    fs := TFileStream.Create(FileName, fmOpenRead);\r\n    try\r\n      if RequiredSizeMod &lt; 1 then\r\n        SetLength(Result, fs.Size)\r\n      else\r\n        SetLength(Result, ((fs.Size div RequiredSizeMod) + 1) *\r\n          RequiredSizeMod);\r\n      fs.ReadBuffer(Result[0], fs.Size);\r\n    finally\r\n      fs.Free;\r\n    end;\r\n  end\r\n  else\r\n    SetLength(Result, 0);\r\n\r\nend;<\/pre>\n<p>O resultado do envio ser\u00e1 um par\u00e2metro de sa\u00edda do tipo TCloudResponseInfo, este cont\u00e9m a propriedade StatusCode, requisi\u00e7\u00f5es realizadas com sucesso retornam o c\u00f3digo 200 ou 201.<\/p>\n<pre class=\"brush: delphi\">    StorageService.UploadObject(BucketName, ExtractFileName(FileName), Content, False, Metadata, nil, amzbaPublicRead, Result);\r\n    ShowResponseInfo(TClouds[AmazonIndex], Result);<\/pre>\n<p>Clique <a href=\"http:\/\/radstudiodemos.svn.sourceforge.net\/viewvc\/radstudiodemos\/branches\/RadStudio_XE2\/Delphi\/CloudAPI\/CloudUpload\/CloudDM.pas?revision=321&amp;view=markup\" target=\"_blank\">aqui<\/a> para visualizar o c\u00f3digo fonte da unit CloudDM.pas.<\/p>\n<p>O c\u00f3digo fonte completo est\u00e1 dispon\u00edvel no reposit\u00f3rio do RAD Studio XE2 no sourceforge e as informa\u00e7\u00f5es para efetuar o download dos fontes completo est\u00e3o dispon\u00edveis <a href=\"http:\/\/www.andreanolanusse.com\/pt\/shell-extension-para-windows-32-bit-e-64-bit-com-delphi-xe2\/\">aqui<\/a>.<br \/>\nNesta sequ\u00eancia de artigos voc\u00ea 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&#8217;s para interagir com as nuvens<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nesta segunda e \u00faltima parte do artigo sobre envio de arquivos para as nuvens vamos detalhar como funciona o envio de arquivos para o para Amazon S3. Voc\u00ea pode ler os artigos que antecedem estas sequ\u00eancia nos links abaixo, \u00e9 importante ler estes artigos para melhor entendimento deste artigo: Shell Extension para Windows 32-bt and [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1379,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_s2mail":"yes","footnotes":""},"categories":[102],"tags":[63,181],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v16.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>CloudAPI \u2013 Envio de arquivos para Amazon S3 e Windows Azure \u2013 Parte 2 | Andreano Lanusse | Tecnologia e Desenvolvimento de Software<\/title>\n<meta name=\"description\" content=\"Nesta segunda e \u00faltima parte do artigo sobre envio de arquivos para as nuvens vamos detalhar como funciona o envio de arquivos para o para Amazon S3. Voc\u00ea\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.andreanolanusse.com\/pt\/cloudapi-envio-de-arquivos-para-amazon-s3-e-windows-azure-parte-2\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"CloudAPI \u2013 Envio de arquivos para Amazon S3 e Windows Azure \u2013 Parte 2 | Andreano Lanusse | Tecnologia e Desenvolvimento de Software\" \/>\n<meta property=\"og:description\" content=\"Nesta segunda e \u00faltima parte do artigo sobre envio de arquivos para as nuvens vamos detalhar como funciona o envio de arquivos para o para Amazon S3. Voc\u00ea\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.andreanolanusse.com\/pt\/cloudapi-envio-de-arquivos-para-amazon-s3-e-windows-azure-parte-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Andreano Lanusse | Tecnologia e Desenvolvimento de Software\" \/>\n<meta property=\"article:published_time\" content=\"2011-10-26T21:31:27+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2013-05-22T03:49:06+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2011\/10\/Cloud-ShellExtension.png\" \/>\n\t<meta property=\"og:image:width\" content=\"923\" \/>\n\t<meta property=\"og:image:height\" content=\"642\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@andreanolanusse\" \/>\n<meta name=\"twitter:site\" content=\"@andreanolanusse\" \/>\n<meta name=\"twitter:label1\" content=\"Est. tempo de leitura\">\n\t<meta name=\"twitter:data1\" content=\"4 minutos\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#website\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"name\":\"Andreano Lanusse | Tecnologia e Desenvolvimento de Software\",\"description\":\"Andreano Lanusse blog - artigos, tutoriais e v&iacute;deos sobre tecnologia, desenvolvimento de software (Delphi XE4, C#, PHP, .NET) e t&eacute;cnicas de programa&ccedil;&atilde;o\",\"publisher\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"http:\/\/www.andreanolanusse.com\/pt\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/cloudapi-envio-de-arquivos-para-amazon-s3-e-windows-azure-parte-2\/#primaryimage\",\"inLanguage\":\"pt-BR\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2011\/10\/Cloud-ShellExtension.png\",\"contentUrl\":\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2011\/10\/Cloud-ShellExtension.png\",\"width\":923,\"height\":642},{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/cloudapi-envio-de-arquivos-para-amazon-s3-e-windows-azure-parte-2\/#webpage\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/cloudapi-envio-de-arquivos-para-amazon-s3-e-windows-azure-parte-2\/\",\"name\":\"CloudAPI \\u2013 Envio de arquivos para Amazon S3 e Windows Azure \\u2013 Parte 2 | Andreano Lanusse | Tecnologia e Desenvolvimento de Software\",\"isPartOf\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/cloudapi-envio-de-arquivos-para-amazon-s3-e-windows-azure-parte-2\/#primaryimage\"},\"datePublished\":\"2011-10-26T21:31:27+00:00\",\"dateModified\":\"2013-05-22T03:49:06+00:00\",\"description\":\"Nesta segunda e \\u00faltima parte do artigo sobre envio de arquivos para as nuvens vamos detalhar como funciona o envio de arquivos para o para Amazon S3. Voc\\u00ea\",\"breadcrumb\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/cloudapi-envio-de-arquivos-para-amazon-s3-e-windows-azure-parte-2\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.andreanolanusse.com\/pt\/cloudapi-envio-de-arquivos-para-amazon-s3-e-windows-azure-parte-2\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/cloudapi-envio-de-arquivos-para-amazon-s3-e-windows-azure-parte-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"name\":\"In\\u00edcio\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/cloudapi-envio-de-arquivos-para-amazon-s3-e-windows-azure-parte-2\/#webpage\"}}]},{\"@type\":\"Article\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/cloudapi-envio-de-arquivos-para-amazon-s3-e-windows-azure-parte-2\/#article\",\"isPartOf\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/cloudapi-envio-de-arquivos-para-amazon-s3-e-windows-azure-parte-2\/#webpage\"},\"author\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"headline\":\"CloudAPI \\u2013 Envio de arquivos para Amazon S3 e Windows Azure \\u2013 Parte 2\",\"datePublished\":\"2011-10-26T21:31:27+00:00\",\"dateModified\":\"2013-05-22T03:49:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/cloudapi-envio-de-arquivos-para-amazon-s3-e-windows-azure-parte-2\/#webpage\"},\"commentCount\":1,\"publisher\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"image\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/cloudapi-envio-de-arquivos-para-amazon-s3-e-windows-azure-parte-2\/#primaryimage\"},\"keywords\":[\"Cloud\",\"Delphi\"],\"articleSection\":[\"Delphi\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"http:\/\/www.andreanolanusse.com\/pt\/cloudapi-envio-de-arquivos-para-amazon-s3-e-windows-azure-parte-2\/#respond\"]}]},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\",\"name\":\"Andreano Lanusse\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#personlogo\",\"inLanguage\":\"pt-BR\",\"url\":\"http:\/\/0.gravatar.com\/avatar\/6a9c6f73c7c480fb826c7303288abfd3?s=96&d=mm&r=g\",\"contentUrl\":\"http:\/\/0.gravatar.com\/avatar\/6a9c6f73c7c480fb826c7303288abfd3?s=96&d=mm&r=g\",\"caption\":\"Andreano Lanusse\"},\"logo\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#personlogo\"},\"sameAs\":[\"https:\/\/twitter.com\/andreanolanusse\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","_links":{"self":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts\/1398"}],"collection":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/comments?post=1398"}],"version-history":[{"count":0,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts\/1398\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/media\/1379"}],"wp:attachment":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/media?parent=1398"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/categories?post=1398"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/tags?post=1398"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}