{"id":8755,"date":"2020-06-02T10:01:46","date_gmt":"2020-06-02T17:01:46","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=8755"},"modified":"2023-09-29T13:48:47","modified_gmt":"2023-09-29T20:48:47","slug":"store-sync-binary-data-attachments-blobs-couchbase-mobile","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/","title":{"rendered":"Lidar com anexos e blobs de dados bin\u00e1rios com o Couchbase Mobile"},"content":{"rendered":"<p><a href=\"https:\/\/docs.couchbase.com\/sync-gateway\/2.7\/cbmintro.html\">Couchbase Mobile<\/a> suporta um modelo de dados NoSQL no estilo de documento JSON. Al\u00e9m de suportar os tipos de dados JSON padr\u00e3o, o Couchbase Mobile tamb\u00e9m suporta dados bin\u00e1rios que incluem imagens, \u00e1udio, v\u00eddeo, arquivos PDF, etc. Um documento JSON pode ser associado a um ou mais elementos de dados bin\u00e1rios chamados de \"anexos\" ou \"blobs\". Os dados bin\u00e1rios podem ser sincronizados entre os clientes do Couchbase Lite e o servidor por meio do Sync Gateway. Nesta postagem, discutiremos como criar anexos de dados bin\u00e1rios e como recuper\u00e1-los e atualiz\u00e1-los. Tamb\u00e9m damos uma olhada nos bastidores sobre como os anexos s\u00e3o representados internamente, as idiossincrasias relacionadas e como lidar com elas.<\/p>\n<p>Tudo neste post se aplica a uma implanta\u00e7\u00e3o baseada no Couchbase Mobile 2.x.<\/p>\n<h2 id=\"background:attachmentsandblobs\">Hist\u00f3rico: Anexos e blobs<\/h2>\n<p>O suporte \u00e0 associa\u00e7\u00e3o de dados bin\u00e1rios com documentos JSON no Couchbase Mobile evoluiu ao longo dos anos. A representa\u00e7\u00e3o interna dos dados bin\u00e1rios no documento JSON mudou nas vers\u00f5es do Couchbase Mobile. No Couchbase Mobile 1.x, os dados bin\u00e1rios eram armazenados na forma de \"anexos\" em um documento de n\u00edvel superior \"_<em>anexos<\/em>\". O Couchbase Mobile introduziu o atributo <a href=\"https:\/\/docs.couchbase.com\/couchbase-lite\/2.7\/swift.html#blobs\">bolha<\/a> para armazenar dados bin\u00e1rios. Na maioria dos casos, a discrep\u00e2ncia entre as representa\u00e7\u00f5es nas vers\u00f5es \u00e9 perfeitamente tratada pelo Couchbase Mobile, de modo que os usu\u00e1rios finais n\u00e3o precisam fazer nada de especial em seus aplicativos para lidar com isso. No entanto, h\u00e1 certos casos em que os desenvolvedores de aplicativos precisam tomar medidas adicionais para lidar com a discrep\u00e2ncia. Tamb\u00e9m discutiremos essas medidas nesta postagem e tentaremos responder a algumas perguntas frequentes.<\/p>\n<h2 id=\"workflow1:handlingattachmentscreatedoncouchbaselite\">Fluxo de trabalho #1: manipula\u00e7\u00e3o de anexos criados no Couchbase Lite<\/h2>\n<p>Vamos dar uma olhada em como voc\u00ea pode criar documentos JSON com anexos de dados bin\u00e1rios com o Couchbase Lite e sincroniz\u00e1-los com o lado do servidor. Este \u00e9 o fluxo que estaremos descrevendo:<\/p>\n<figure><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/05\/attachments.png\" alt=\"\" \/><\/figure>\n<h3 id=\"createbinarydataoncouchbaselite\">Criar anexos de dados bin\u00e1rios no Couchbase Lite<\/h3>\n<p>Os desenvolvedores devem usar o <a href=\"https:\/\/docs.couchbase.com\/couchbase-lite\/2.7\/swift.html#blobs\">API de blob<\/a> para criar dados de blob. Um documento pode ser associado a um ou mais anexos ou blobs. Aqui est\u00e1 um trecho de c\u00f3digo que mostra o uso dessa API no Swift. Consulte a documenta\u00e7\u00e3o do desenvolvedor para obter trechos de c\u00f3digo equivalentes para outras plataformas.<\/p>\n<pre><code>\r\n let mutableDoc = MutableDocument.init(id: \"user::priya\")\r\n if let profileImage = UIImage(named: \"profile.jpg\"), let imageData = UIImageJPEGRepresentation(profileImage, 0.75) {\r\n   let blob = Blob(contentType: \"image\/jpeg\", data: imageData)\r\n   mutableDoc.setBlob(blob, forKey: \"image\")\r\n }\r\n \/\/ \u2026 Add other properties\r\n mutableDoc.setString(\"user\", forKey: \"type\")\r\n mutableDoc.setString(\"Priya\", forKey: \"name\")\r\n mutableDoc.setString(\"priya.rajagopal@couchbase.com, forKey: \"email\")\r\n do {\r\n   try? db.saveDocument(mutableDoc)\r\n }\r\n catch {\r\n   print(\"Error in saving document : (error)\")\r\n }\r\n<\/code><\/pre>\n<h3 id=\"internalrepresentation\">Representa\u00e7\u00e3o interna<\/h3>\n<p>Quando o documento \u00e9 criado no Couchbase Lite, internamente, ele tem a seguinte apar\u00eancia:<\/p>\n<pre><code>{\r\n  \"email\": \"priya.rajagopal@couchbase.com\",\r\n  \"image\": {\r\n   \"length\": 3888349,\r\n   \"digest\": \"sha1\u20134xlj1AKFgLdzcD7a1pVChrVTJIc=\",\r\n   \"content_type\": \"image\/jpeg\",\r\n   \"@type\": \"blob\"\r\n  },\r\n \"type\": \"user\",\r\n \"name\": \"Priya\",\r\n \"id\": \"user::priya\",\r\n \"rev\": \"1\u20131c8502034001b333cc469fe8c4c39e112eedf8a3\"\r\n}<\/code><\/pre>\n<p>Observe o <em>\"@type\": \"blob\" <\/em>criado para os dados do tipo de imagem.<\/p>\n<p><strong>Observa\u00e7\u00e3o<\/strong> que existem v\u00e1rios metadados em n\u00edvel de sistema, como _<em>id<\/em> que est\u00e3o inclu\u00eddos no documento. Por quest\u00f5es de brevidade, nem tudo \u00e9 mostrado no exemplo. Os aplicativos nunca devem fazer suposi\u00e7\u00f5es sobre o formato e a disponibilidade dos metadados em n\u00edvel de sistema e, por esse motivo, nunca devem acessar esses atributos diretamente. Sempre use as op\u00e7\u00f5es de recupera\u00e7\u00e3o de metadados, como <em>meta().id<\/em>.<\/p>\n<h3 id=\"syncingattachmentstosyncgateway\">Sincroniza\u00e7\u00e3o de anexos com o Sync Gateway<\/h3>\n<p>O Sync Gateway \u00e9 compat\u00edvel com vers\u00f5es anteriores do Couchbase Mobile 1.x. Isso significa que o Sync Gateway precisa ser capaz de processar dados bin\u00e1rios usando a vers\u00e3o 1.x _. <em>anexos<\/em> bem como a representa\u00e7\u00e3o de estilo 2.x <em>bolha<\/em> tipo. Isso tamb\u00e9m implica que, quando o cliente Couchbase Lite 2.x envia dados para o Sync Gateway, ele precisa envi\u00e1-los em um formato compat\u00edvel com os clientes 1.x.<\/p>\n<p>Por esse motivo, quando o Couchbase Lite sincroniza o documento com o Sync Gateway, ele adiciona a tag <strong><em>_<\/em><\/strong><em>anexos\u00a0<\/em>entrada no documento. Portanto, o documento, quando enviado para cima, seria parecido com o exemplo abaixo. A lista de anexos associados ao documento \u00e9 especificada no campo <em>_anexos<\/em> objeto.<\/p>\n<pre style=\"padding-left: 80px\"><em><code>{\r\n  \"attachments\": {\r\n  \"blob\/image\": {\r\n   \"content_type\": \"image\/jpeg\",\r\n   \"digest\": \"sha1\u20134xlj1AKFgLdzcD7a1pVChrVTJIc=\",\r\n   \"length\": 3888349,\r\n   \"revpos\": 1,\r\n   \"stub\": true\r\n   }\r\n  },\r\n  \"email\": \"priya.rajagopal@couchbase.com\",\r\n  \"image\": {\r\n  \"@type\": \"blob\",\r\n  \"content_type\": \"image\/jpeg\",\r\n  \"digest\": \"sha1\u20134xlj1AKFgLdzcD7a1pVChrVTJIc=\",\r\n  \"length\": 3888349\r\n  },\r\n  \"name\": \"Priya\",\r\n  \"type\": \"user\",\r\n  \"id\": \"user::priya\",\r\n  \"rev\": \"1\u20131c8502034001b333cc469fe8c4c39e112eedf8a3\",\r\n}<\/code><\/em><\/pre>\n<p><strong>Observa\u00e7\u00e3o<\/strong> que existem v\u00e1rios metadados em n\u00edvel de sistema, como _<em>id<\/em> que est\u00e1 inclu\u00eddo no documento. Por quest\u00f5es de brevidade, nem tudo \u00e9 mostrado no exemplo. Os aplicativos nunca devem fazer suposi\u00e7\u00f5es sobre o formato e a disponibilidade dos metadados em n\u00edvel de sistema e, por esse motivo, nunca devem acessar esses atributos diretamente. Sempre use as op\u00e7\u00f5es de recupera\u00e7\u00e3o de metadados, como <em>meta().id<\/em>.<\/p>\n<h3 id=\"retrievalofattachmentonsyncgateway\">Recupera\u00e7\u00e3o de anexo no Sync Gateway<\/h3>\n<p>Os dados do anexo devem ser recuperados por meio do Sync Gateway <a href=\"https:\/\/docs.couchbase.com\/sync-gateway\/2.7\/rest-api.html#\/attachment\/get__db___doc___attachment_\">_<em>anexos<\/em> REST<\/a> endpoint. No momento da reda\u00e7\u00e3o deste post, os anexos n\u00e3o podem ser gerenciados diretamente usando os SDKs do Couchbase Server.<\/p>\n<p>Aqui est\u00e1 um exemplo de comando curl para recuperar o(s) anexo(s) associado(s) a um documento usando o comando _<em>anexos<\/em> REST. Substitua o cabe\u00e7alho de autoriza\u00e7\u00e3o por credenciais adequadas correspondentes ao usu\u00e1rio configurado em seu sistema. Al\u00e9m disso, observe o nome do anexo, \"<em>bolha_<\/em>%2Fimage&#8221; is the URL encoded version of <em>\"blob<\/em>\/image\"_.<\/p>\n<pre><code>curl -X GET \r\n 'https:\/\/sync-gateway-url:4984\/dbname\/user::priya\/blob_%2Fimage' \r\n -H 'Accept: application\/json' \r\n -H 'Authorization: Basic ZGVtbzpwYXNzd29yZA=='<\/code><\/pre>\n<h3 id=\"updatingattachmentsonsyncgateway\">Atualiza\u00e7\u00e3o de anexos no Sync Gateway<\/h3>\n<p>Os dados do anexo devem ser atualizados por meio do Sync Gateway <a href=\"https:\/\/docs.couchbase.com\/sync-gateway\/2.7\/rest-api.html#\/attachment\/put__db___doc___attachment_\">_<em>anexos<\/em> REST<\/a> endpoint. No momento da reda\u00e7\u00e3o deste post, os anexos m\u00f3veis n\u00e3o podem ser gerenciados usando os SDKs do Couchbase Server.<\/p>\n<p>Aqui est\u00e1 um exemplo de comando curl para atualizar um anexo associado a um documento usando o _<em>anexos<\/em> REST. Voc\u00ea substituiria o cabe\u00e7alho de autoriza\u00e7\u00e3o por credenciais adequadas correspondentes ao usu\u00e1rio configurado em sua instala\u00e7\u00e3o. Al\u00e9m disso, observe que o cabe\u00e7alho <em>\"rev\"<\/em> deve ser fornecido. Esse par\u00e2metro corresponde \u00e0 revis\u00e3o do documento que deve ser atualizado. Voc\u00ea pode recuperar o revId usando o par\u00e2metro <a href=\"https:\/\/docs.couchbase.com\/sync-gateway\/2.7\/rest-api.html#\/document\/get__db___doc_\">GET documento REST<\/a>.<\/p>\n<pre><code> curl -i -X PUT 'https:\/\/sync-gateway-url:4984\/dbname\/user::priya\/blob_%2Fimage?rev=12-fa2bf00dab7e811eb562a502429ec633' \r\n -H 'Accept: application\/json' \r\n -H 'Authorization: Basic ZGVtbzE6cGFzc3dvcmQ=' \r\n -H 'Content-Type: image\/png' \r\n -H 'cache-control: no-cache' \r\n \u2013data-binary \"@layered.png\"<\/code><\/pre>\n<h3 id=\"but...wait..amismatch\">Mas... espere... uma incompatibilidade!<\/h3>\n<p>Agora, depois de atualizar o anexo, se voc\u00ea recuperar o documento usando o <a href=\"https:\/\/docs.couchbase.com\/sync-gateway\/2.7\/rest-api.html#\/document\/get__db___doc_\">GET documento REST<\/a>,<\/p>\n<pre><code> curl -X GET \r\n 'https:\/\/sync-gateway-url:4984\/dbname\/user::priya\/blob_%2Fimage' \r\n -H 'Accept: application\/json' \r\n -H 'Authorization: Basic ZGVtbzE6cGFzc3dvcmQ=' \r\n -H 'Content-Type: application\/json' \r\n -H 'cache-control: no-cache'<\/code><\/pre>\n<p>A resposta correspondente seria algo parecido com isto:<\/p>\n<pre><code>{\r\n  \"attachments\": {\r\n  \"blob\/image\": {\r\n   \"content_type\": \"image\/png\",\r\n   \"digest\": \"sha1-XeeXt0I014+1qpH+s2S2AUSg4II=\",\r\n   \"length\": 3444504,\r\n   \"revpos\": 16,\r\n   \"stub\": true\r\n   }\r\n  },\r\n  \"id\": \"user::demo1\",\r\n  \"rev\": \"13-e61d1a9e63069030212007a8b5eddde9\",\r\n  \"address\": \"\",\r\n  \"email\": \"demo1\",\r\n  \"image\": {\r\n   \"@type\": \"blob\",\r\n   \"content_type\": \"image\/jpeg\",\r\n   \"digest\": \"sha1\u20134xlj1AKFgLdzcD7a1pVChrVTJIc=\",\r\n   \"length\": 3888349\r\n  },\r\n  \"name\": \"Priya Rajagopal\",\r\n  \"type\": \"user\"\r\n}<\/code><\/pre>\n<p>Voc\u00ea perceber\u00e1 que o <em>_Anexo<\/em> e <em>bolha<\/em> n\u00e3o coincidem. Enquanto o <em>_Anexo<\/em> aponta para a imagem mais recente, a entrada <em>bolha<\/em> ainda descreve a imagem antiga. <em>Mas tudo bem<\/em>!<\/p>\n<p>O motivo dessa discrep\u00e2ncia \u00e9 o fato de o Sync Gateway lidar apenas com anexos do estilo 1.x.<\/p>\n<p>Ent\u00e3o, como isso ainda funciona?<\/p>\n<p>Isso funciona porque, no contexto do Sync Gateway que lida com anexos no estilo 1.x, somente a entrada do anexo \u00e9 honrada.<\/p>\n<p>Mas e quanto ao Couchbase Lite? O que acontece quando o documento atualizado \u00e9 sincronizado pelo cliente Couchbase Lite 2.x?<\/p>\n<p>Quando o documento \u00e9 replicado pelo cliente do Couchbase Lite 2.x, o Couchbase Lite procura a presen\u00e7a de <em>_anexos<\/em> e <em>bolhas<\/em> dentro do documento e implementa a l\u00f3gica apropriada para identificar que se trata de um documento de estilo 2.x criado por um cliente 2.x, mas que foi posteriormente atualizado por um cliente 1.x (como a API REST do Sync Gateway). Portanto, ele trata o <em>_anexos<\/em> como o anexo \"real\" e unifica a entrada de bolha correspondente.<\/p>\n<p>Do ponto de vista do desenvolvedor, tudo isso \u00e9 tratado automaticamente. Portanto, voc\u00ea n\u00e3o precisa se preocupar com nenhum dos detalhes. Como desenvolvedor, voc\u00ea teria que saber como recuperar o anexo atualizado de dentro do aplicativo habilitado para o Couchbase Lite.<\/p>\n<h3 id=\"retrievalofupdatedattachmentoncouchbaselite\">Recupera\u00e7\u00e3o de anexos atualizados no Couchbase Lite<\/h3>\n<p>Quando o anexo atualizado for sincronizado com seu aplicativo Couchbase Lite, use o comando <a href=\"https:\/\/docs.couchbase.com\/mobile\/2.7.0\/couchbase-lite-swift\/Classes\/Blob.html#\/s:18CouchbaseLiteSwift4BlobC11contentType4dataACSS_10Foundation4DataVtcfc\">API de blob<\/a> para recuperar os dados. Aqui est\u00e1 um trecho de c\u00f3digo que mostra o uso dessa API em swift. Consulte a documenta\u00e7\u00e3o do desenvolvedor para obter trechos de c\u00f3digo equivalentes para outras plataformas.<\/p>\n<pre><code>\r\n if let doc = db.document(withID: \"user::priya\") {\r\n     let blobValue = doc.blob(forKey:\"image\")?.content\r\n     \/\/ use the blobValue\r\n }\r\n<\/code><\/pre>\n<p>Agora vamos dar uma olhada no fluxo inverso.<\/p>\n<h2 id=\"workflow2:handlingofattachmentscreatedonsyncgateway\">Fluxo de trabalho #2: manipula\u00e7\u00e3o de anexos criados no Sync Gateway<\/h2>\n<p>Vamos dar uma olhada em como voc\u00ea pode criar documentos JSON com anexos de dados bin\u00e1rios no Sync Gateway e sincroniz\u00e1-los com o lado do Couchbase Lite.<br \/>\nEsse \u00e9 o fluxo que estaremos descrevendo.<\/p>\n<figure><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/05\/attachments-2.png\" alt=\"\" \/><\/figure>\n<h3 id=\"createbinarydataattachmentsonserver\">Criar anexos de dados bin\u00e1rios no servidor<\/h3>\n<p>Para anexar dados bin\u00e1rios no lado do Couchbase Server que podem ser sincronizados com os clientes por meio do Sync Gateway, voc\u00ea teria que usar o Sync Gateway <a href=\"https:\/\/docs.couchbase.com\/sync-gateway\/2.7\/rest-api.html#\/attachment\/put__db___doc___attachment_\">ponto de extremidade REST dos anexos<\/a>. No momento da reda\u00e7\u00e3o deste post, os anexos compat\u00edveis com dispositivos m\u00f3veis n\u00e3o podem ser criados diretamente usando os SDKs do Couchbase Server. Os dados do anexo criados por meio do endpoint REST do Sync Gateway s\u00e3o mantidos no bucket do Couchbase Server e sincronizados com os clientes do Couchbase Lite, sujeitos \u00e0s pol\u00edticas de controle de acesso configuradas no Sync Gateway.<\/p>\n<p>Para fazer isso, primeiro crie um documento (ou recupere um documento criado anteriormente) e, em seguida, crie o anexo para o documento. Como alternativa, voc\u00ea poderia criar um documento de v\u00e1rias partes com dados JSON e bin\u00e1rios. Mas isso pode ser tedioso, pois voc\u00ea tamb\u00e9m precisaria gerar os metadados relevantes do anexo. Portanto, as etapas descritas abaixo s\u00e3o a minha op\u00e7\u00e3o preferida<\/p>\n<ul>\n<li><strong>Criar documento<\/strong><\/li>\n<\/ul>\n<p>Um documento JSON pode ser criado diretamente no Couchbase Server usando o SDK do Couchbase Server ou a interface do usu\u00e1rio do administrador, ou voc\u00ea pode cri\u00e1-lo usando o <a href=\"https:\/\/docs.couchbase.com\/sync-gateway\/2.7\/rest-api.html#\/document\/put__db___doc_\">Documento PUT<\/a> API REST. O documento tamb\u00e9m poderia ter sido sincronizado a partir de um cliente Couchbase Lite.<\/p>\n<p>Aqui est\u00e1 um exemplo de uso do endpoint REST do Sync Gateway para criar um documento com Id <em>\"user::jane\"<\/em>. Substitua o cabe\u00e7alho de autoriza\u00e7\u00e3o por credenciais adequadas correspondentes ao usu\u00e1rio configurado em sua instala\u00e7\u00e3o.<\/p>\n<pre><code>curl -X PUT \r\n 'https:\/\/sync-gateway-url:4984\/dbname\/user::jane\/' \r\n -H 'Accept: application\/json' \r\n -H 'Authorization: Basic ZGVtbzpwYXNzd29yZA==' \r\n -H 'Content-Type: application\/json' \r\n -d '{\r\n \"email\": \"jane.doe@example.com\",\r\n \"type\": \"user\",\r\n \"name\": \"Jane Doe\"\r\n}'<\/code><\/pre>\n<p>A resposta seria semelhante \u00e0 seguinte:<\/p>\n<pre><code>{\r\n  \"id\": \"user::jane\",\r\n  \"ok\": true,\r\n  \"rev\": \"1-ed2d37e7ece0dc5726fecd211433cbba\"\r\n}<\/code><\/pre>\n<ul>\n<li><strong>Criar anexo para documento no Sync Gateway<\/strong><\/li>\n<\/ul>\n<p>Os dados do anexo devem ser criados por meio do Sync Gateway <a href=\"https:\/\/docs.couchbase.com\/sync-gateway\/2.7\/rest-api.html#\/attachment\/put__db___doc___attachment_\">_<em>anexos<\/em> REST<\/a> endpoint. Essa etapa \u00e9 id\u00eantica ao fluxo anterior quando um anexo estava sendo atualizado por meio do ponto de extremidade REST.<\/p>\n<p>Aqui est\u00e1 um exemplo de comando curl para atualizar um anexo associado a um documento usando o _<em>anexos<\/em> REST. Voc\u00ea substituiria o cabe\u00e7alho de autoriza\u00e7\u00e3o por credenciais adequadas correspondentes ao usu\u00e1rio configurado em sua instala\u00e7\u00e3o. O cabe\u00e7alho <em>\"rev\"<\/em> deve ser fornecido. Esse par\u00e2metro corresponde \u00e0 revis\u00e3o do documento que deve ser atualizado.<\/p>\n<pre><code> curl -i -X PUT \r\n 'https:\/\/sync-gateway-url:4984\/dbname\/user::jane\/blob_%2Fimage?rev=1-ed2d37e7ece0dc5726fecd211433cbba' \r\n -H 'Accept: application\/json' \r\n -H 'Authorization: Basic ZGVtbzE6cGFzc3dvcmQ=' \r\n -H 'Content-Type: image\/png' \r\n \u2013data-binary \"@layered.png\u201d<\/code><\/pre>\n<h3 id=\"internalrepresentation\">Representa\u00e7\u00e3o interna<\/h3>\n<p>Quando o documento for atualizado pelo Sync Gateway, ele ter\u00e1 a seguinte apar\u00eancia<br \/>\nSe voc\u00ea recuperar o documento usando o <a href=\"https:\/\/docs.couchbase.com\/sync-gateway\/2.7\/rest-api.html#\/document\/get__db___doc_\">GET documento REST<\/a>,<\/p>\n<pre><code> curl -X GET \r\n 'https:\/\/sync-gateway-url:4984\/dbname\/user::jane\/blob_%2Fimage' \r\n -H 'Accept: application\/json' \r\n -H 'Authorization: Basic ZGVtbzE6cGFzc3dvcmQ=' \r\n -H 'Content-Type: application\/json' \r\n -H 'cache-control: no-cache'<\/code><\/pre>\n<p>A resposta correspondente seria algo parecido com isto:<\/p>\n<pre><em><code>{\r\n  \"attachments\": {\r\n  \"blob\/image\": {\r\n   \"content_type\": \"image\/png\",\r\n   \"digest\": \"sha1-VteI8PPA3tFVxeW8z2qoJpQo40Y=\",\r\n   \"length\": 1768,\r\n   \"revpos\": 2,\r\n   \"stub\": true\r\n   }\r\n  },\r\n  \"id\": \"user::jane\",\r\n  \"rev\": \"2\u201395da324bd67db252d8b682cd113e3879\",\r\n  \"email\": \"jane.doe@example.com\",\r\n  \"type\": \"user\",\r\n  \"name\": \"Jane Doe\"\r\n}<\/code><\/em><\/pre>\n<p>A cria\u00e7\u00e3o de anexos usando a API REST de anexos do Sync Gateway resultar\u00e1 na representa\u00e7\u00e3o de anexos no estilo 1.x. Observe que n\u00e3o h\u00e1 metadados \"blob\" no estilo 2.x. \u00c9 importante observar isso quando voc\u00ea acessar o documento no Couchbase Lite<\/p>\n<h3 id=\"retrievalofupdatedattachmentoncouchbaselite\">Recupera\u00e7\u00e3o de anexos atualizados no Couchbase Lite<\/h3>\n<p>Quando o documento criado anteriormente \u00e9 sincronizado com o lado do Couchbase Lite, ele detecta que se trata de um documento de estilo 1.x e deixa o <em>_anexos<\/em>\u00a0intacta. Ele trata os objetos aninhados dentro do <em>_anexos<\/em> como bolhas. No entanto, o documento n\u00e3o \u00e9 atualizado automaticamente para incluir a entrada \"blob\" que \u00e9 adicionada. Portanto, seu aplicativo precisaria procurar a presen\u00e7a de bolhas usando a fun\u00e7\u00e3o <a href=\"https:\/\/docs.couchbase.com\/mobile\/2.7.0\/couchbase-lite-swift\/Classes\/Blob.html#\/s:18CouchbaseLiteSwift4BlobC11contentType4dataACSS_10Foundation4DataVtcfc\">API de blob<\/a> em ambos os locais.<\/p>\n<pre><code> \/\/ First look for blob at the top level blob entry\r\n if let imageVal = userVal.blob(forKey:\"image\")?.content {\r\n   \/\/ imageVal contains the attachment\r\n }\r\n else {\r\n   \/\/ Handle campatability with attachments created via Sync Gateway API\r\n   \/\/ Those attachments are created with 1.x style.\r\n   let attachments = userVal.dictionary(forKey: \"attachments\")\r\n   let imageVal = attachments?.blob(forKey:\"blob\/image\")?.content\r\n   \/\/ imageVal contains the attachment\r\n }<\/code><\/pre>\n<h2 id=\"faq\">PERGUNTAS FREQUENTES<\/h2>\n<p>Para concluir, compilei uma lista de perguntas frequentes relacionadas ao manuseio de anexos no Couchbase Mobile<\/p>\n<h3 id=\"whereareattachmentsstored\">Onde os anexos s\u00e3o armazenados?<\/h3>\n<p>No Couchbase Lite, os anexos s\u00e3o armazenados na inst\u00e2ncia do banco de dados do Couchbase Lite que cont\u00e9m o documento correspondente. Ele \u00e9 armazenado separadamente do documento que cont\u00e9m os metadados associados que cont\u00eam a refer\u00eancia ao anexo. Se o mesmo anexo for compartilhado por v\u00e1rios documentos, apenas uma \u00fanica inst\u00e2ncia do anexo ser\u00e1 armazenada no banco de dados.<\/p>\n<p>No Couchbase Server, os anexos s\u00e3o armazenados no mesmo bucket do Couchbase Server que o documento correspondente. Ele \u00e9 armazenado separadamente do documento que cont\u00e9m os metadados associados que cont\u00eam a refer\u00eancia ao anexo. Se o mesmo anexo for compartilhado por v\u00e1rios documentos, somente uma \u00fanica inst\u00e2ncia do anexo ser\u00e1 armazenada no bucket.<\/p>\n<h3 id=\"howmanyattachmentscanbeassociatedwithadocument\">H\u00e1 um limite para o n\u00famero de anexos que podem ser associados a um documento?<\/h3>\n<p>Voc\u00ea pode anexar um ou mais anexos a um documento JSON. N\u00e3o h\u00e1 limites r\u00edgidos para o n\u00famero de anexos que podem ser associados a um documento. No entanto, como os metadados do anexo s\u00e3o armazenados nos xattrs do documento (quando shared_bucket_access est\u00e1 ativado), o n\u00famero de anexos \u00e9 limitado pelo tamanho permitido dos metadados de sincroniza\u00e7\u00e3o por documento. Com metadados de anexos variando de 100 a 200 bytes e limite de tamanho de metadados de sincroniza\u00e7\u00e3o de 1 MB por documento, h\u00e1 limites pr\u00e1ticos para o n\u00famero de anexos que podem ser associados a um documento.<\/p>\n<h3 id=\"whatisthemaximumsizeofanattachment\">Qual \u00e9 o tamanho m\u00e1ximo de um anexo?<\/h3>\n<p>O tamanho m\u00e1ximo de cada anexo \u00e9 de 20 MB. Isso decorre dos limites de tamanho dos documentos no Couchbase Server. Embora o pr\u00f3prio Couchbase Lite permita anexos de tamanho superior a 20 MB, isso \u00e9 aceit\u00e1vel, desde que o anexo seja apenas local e seja garantido que nunca ser\u00e1 sincronizado com o servidor. No entanto, os desenvolvedores s\u00e3o alertados para n\u00e3o criarem anexos t\u00e3o grandes, pois eles ser\u00e3o rejeitados pelo Sync Gateway.<\/p>\n<h3 id=\"doattachmentssynceverytimetheassociatedjsondocumentchanges\">Os anexos s\u00e3o sincronizados toda vez que o documento JSON associado \u00e9 alterado?<\/h3>\n<p>O protocolo de replica\u00e7\u00e3o \u00e9 otimizado para sincronizar anexos somente quando houver atualiza\u00e7\u00f5es para eles. Isso significa que eles n\u00e3o s\u00e3o enviados ou retirados pelos clientes do Couchbase Lite, mesmo que haja atualiza\u00e7\u00f5es em outros dados nos documentos JSON associados.<\/p>\n<h3 id=\"doattachmentssynceverytimetheassociatedjsondocumentchanges\">Como o protocolo lida com falhas ao sincronizar anexos?<\/h3>\n<p>O protocolo \u00e9 muito robusto em termos de tratamento de falhas de sincroniza\u00e7\u00e3o, por exemplo, devido a interrup\u00e7\u00f5es na rede. Os documentos n\u00e3o s\u00e3o mantidos pelo Sync Gateway ou no Couchbase Lite at\u00e9 que todos os anexos ou blobs associados sejam sincronizados com \u00eaxito. Portanto, pode haver um intervalo de tempo em que voc\u00ea pode acabar com anexos\/blogs \u00f3rf\u00e3os que n\u00e3o t\u00eam documentos associados. Isso n\u00e3o \u00e9 um problema, pois a sincroniza\u00e7\u00e3o subsequente do documento reconhecer\u00e1 que o anexo j\u00e1 est\u00e1 persistente e n\u00e3o tentar\u00e1 ressincroniz\u00e1-lo novamente.<\/p>\n<h2 id=\"whatsnext\">O que vem a seguir<\/h2>\n<p>O Couchbase Mobile oferece uma interface f\u00e1cil de usar para gerenciar anexos. D\u00ea uma olhada no <a href=\"https:\/\/docs.couchbase.com\/couchbase-lite\/2.7\/swift.html#blobs\">documenta\u00e7\u00e3o<\/a> para obter detalhes sobre o manuseio de blob em cada uma das plataformas.<br \/>\nSe tiver d\u00favidas ou coment\u00e1rios, deixe um coment\u00e1rio abaixo ou entre em contato comigo pelo <a href=\"https:\/\/twitter.com\/rajagp\">Twitter<\/a>\u00a0ou <a href=\"mailto:priya.rajagopal@couchbase.com\">enviar-me um e-mail<\/a>. O <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/forums\/\">F\u00f3runs de desenvolvimento do Couchbase<\/a> s\u00e3o um \u00f3timo lugar para se envolver com a comunidade de desenvolvimento do Couchbase.<\/p>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>Couchbase Mobile supports a JSON document style NoSQL data model. In addition to supporting the standard JSON data types, Couchbase Mobile also supports binary data that include images, audio, video, PDF files, etc. A JSON document can be associated with [&hellip;]<\/p>","protected":false},"author":1423,"featured_media":10435,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[2370,1815,1810,1819,2366,2351],"tags":[2358],"ppma_author":[8948],"class_list":["post-8755","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-android","category-best-practices-and-tutorials","category-couchbase-mobile","category-data-modeling","category-sync-gateway","category-xamarin","tag-couchbase-mobile-2-x"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Binary Data Attachments &amp; Blobs: Handle w\/ Couchbase Mobile<\/title>\n<meta name=\"description\" content=\"Create binary data attachments, retrieve and update them, and learn how attachments are internally represented, idiosyncrasies and dealing with them.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Handle Binary Data Attachments &amp; Blobs with Couchbase Mobile\" \/>\n<meta property=\"og:description\" content=\"Create binary data attachments, retrieve and update them, and learn how attachments are internally represented, idiosyncrasies and dealing with them.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-06-02T17:01:46+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-09-29T20:48:47+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/06\/Blog-Binary-Data-1-1.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1590\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Priya Rajagopal, Senior Director, Product Management\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@rajagp\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Priya Rajagopal, Senior Director, Product Management\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/\"},\"author\":{\"name\":\"Priya Rajagopal, Senior Director, Product Management\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c\"},\"headline\":\"Handle Binary Data Attachments &amp; Blobs with Couchbase Mobile\",\"datePublished\":\"2020-06-02T17:01:46+00:00\",\"dateModified\":\"2023-09-29T20:48:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/\"},\"wordCount\":2205,\"commentCount\":8,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/06\/Blog-Binary-Data-1-1.jpg\",\"keywords\":[\"couchbase mobile 2.x\"],\"articleSection\":[\"Android\",\"Best Practices and Tutorials\",\"Couchbase Mobile\",\"Data Modeling\",\"Sync Gateway\",\"Xamarin\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/\",\"name\":\"Binary Data Attachments & Blobs: Handle w\/ Couchbase Mobile\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/06\/Blog-Binary-Data-1-1.jpg\",\"datePublished\":\"2020-06-02T17:01:46+00:00\",\"dateModified\":\"2023-09-29T20:48:47+00:00\",\"description\":\"Create binary data attachments, retrieve and update them, and learn how attachments are internally represented, idiosyncrasies and dealing with them.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/06\/Blog-Binary-Data-1-1.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/06\/Blog-Binary-Data-1-1.jpg\",\"width\":1590,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Handle Binary Data Attachments &amp; Blobs with Couchbase Mobile\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c\",\"name\":\"Priya Rajagopal, Senior Director, Product Management\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4b50a54778b979d8c345b036ab138734\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g\",\"caption\":\"Priya Rajagopal, Senior Director, Product Management\"},\"description\":\"Priya Rajagopal is a Senior Director of Product Management at Couchbase responsible for developer platforms for the cloud and the edge. She has been professionally developing software for over 20 years in several technical and product leadership positions, with 10+ years focused on mobile technologies. As a TISPAN IPTV standards delegate, she was a key contributor to the IPTV standards specifications. She has 22 patents in the areas of networking and platform security.\",\"sameAs\":[\"https:\/\/x.com\/rajagp\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/priya-rajagopalcouchbase-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Binary Data Attachments & Blobs: Handle w\/ Couchbase Mobile","description":"Create binary data attachments, retrieve and update them, and learn how attachments are internally represented, idiosyncrasies and dealing with them.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/","og_locale":"pt_BR","og_type":"article","og_title":"Handle Binary Data Attachments &amp; Blobs with Couchbase Mobile","og_description":"Create binary data attachments, retrieve and update them, and learn how attachments are internally represented, idiosyncrasies and dealing with them.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/","og_site_name":"The Couchbase Blog","article_published_time":"2020-06-02T17:01:46+00:00","article_modified_time":"2023-09-29T20:48:47+00:00","og_image":[{"width":1590,"height":628,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2020\/06\/Blog-Binary-Data-1-1.jpg","type":"image\/jpeg"}],"author":"Priya Rajagopal, Senior Director, Product Management","twitter_card":"summary_large_image","twitter_creator":"@rajagp","twitter_misc":{"Written by":"Priya Rajagopal, Senior Director, Product Management","Est. reading time":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/"},"author":{"name":"Priya Rajagopal, Senior Director, Product Management","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c"},"headline":"Handle Binary Data Attachments &amp; Blobs with Couchbase Mobile","datePublished":"2020-06-02T17:01:46+00:00","dateModified":"2023-09-29T20:48:47+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/"},"wordCount":2205,"commentCount":8,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/06\/Blog-Binary-Data-1-1.jpg","keywords":["couchbase mobile 2.x"],"articleSection":["Android","Best Practices and Tutorials","Couchbase Mobile","Data Modeling","Sync Gateway","Xamarin"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/","url":"https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/","name":"Binary Data Attachments & Blobs: Handle w\/ Couchbase Mobile","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/06\/Blog-Binary-Data-1-1.jpg","datePublished":"2020-06-02T17:01:46+00:00","dateModified":"2023-09-29T20:48:47+00:00","description":"Create binary data attachments, retrieve and update them, and learn how attachments are internally represented, idiosyncrasies and dealing with them.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/06\/Blog-Binary-Data-1-1.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/06\/Blog-Binary-Data-1-1.jpg","width":1590,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/store-sync-binary-data-attachments-blobs-couchbase-mobile\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Handle Binary Data Attachments &amp; Blobs with Couchbase Mobile"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c2da90e57717ee4970c48a87a131ac2c","name":"Priya Rajagopal, Diretora S\u00eanior, Gerenciamento de Produtos","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4b50a54778b979d8c345b036ab138734","url":"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g","caption":"Priya Rajagopal, Senior Director, Product Management"},"description":"Priya Rajagopal \u00e9 diretora s\u00eanior de gerenciamento de produtos da Couchbase, respons\u00e1vel pelas plataformas de desenvolvedor para a nuvem e a borda. Ela desenvolve software profissionalmente h\u00e1 mais de 20 anos em v\u00e1rios cargos t\u00e9cnicos e de lideran\u00e7a de produtos, com mais de 10 anos de foco em tecnologias m\u00f3veis. Como delegada de padr\u00f5es de IPTV da TISPAN, ela foi uma das principais colaboradoras das especifica\u00e7\u00f5es de padr\u00f5es de IPTV. Ela tem 22 patentes nas \u00e1reas de rede e seguran\u00e7a de plataforma.","sameAs":["https:\/\/x.com\/rajagp"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/priya-rajagopalcouchbase-com\/"}]}},"authors":[{"term_id":8948,"user_id":1423,"is_guest":0,"slug":"priya-rajagopalcouchbase-com","display_name":"Priya Rajagopal, Senior Director, Product Management","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/acfb2349788955262cd069497a9e7bdb0e97c26326f2e55811e7c1174e9ef1be?s=96&d=mm&r=g","first_name":"Priya","last_name":"Rajagopal, Senior Director, Product Management","user_url":"","author_category":"","description":"Priya Rajagopal \u00e9 diretora s\u00eanior de gerenciamento de produtos da Couchbase, respons\u00e1vel pelas plataformas de desenvolvedor para a nuvem e a borda. Ela desenvolve software profissionalmente h\u00e1 mais de 20 anos em v\u00e1rios cargos t\u00e9cnicos e de lideran\u00e7a de produtos, com mais de 10 anos de foco em tecnologias m\u00f3veis. Como delegada de padr\u00f5es de IPTV da TISPAN, ela foi uma das principais colaboradoras das especifica\u00e7\u00f5es de padr\u00f5es de IPTV. Ela tem 22 patentes nas \u00e1reas de rede e seguran\u00e7a de plataforma."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/8755","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/1423"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=8755"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/8755\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/10435"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=8755"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=8755"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=8755"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=8755"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}