Angular com Cloudinary

Clayton K. N. Passos
codigorefinado
Published in
5 min readJan 17, 2018

Quero dar uma visão geral Cloudinary, que é uma plataforma que hospeda e processa mídias digitais. As principais mídias são imagens e vídeos.

Quando digo que ele pode processar suas imagens e vídeos, não estou limitando a efeitos visuais, ele pode detectar texto (OCR), fazer algo tagueamento (existe essa palavra?), detectar celebrações como o natal, detectar rostos, auto moderação, e a lista de “Add-ons” vai crescendo com o tempo.

Abaixo, você pode ver uma imagem que demonstra como através de uma simples url, você manipula uma imagem retangular e a transforma em um avatar, esta url pode ser montada por você, ou pode utilizar uma das APIs disponíveis para fazer isto para você.

https://res.cloudinary.com/demo/image/upload/w_400,h_400,c_crop,g_face,r_max/w_200/lady.jpg

Há outras opções, você pode utilizar um componente feito para Angular para realizar a mesma manipulação de imagem acima.

Há várias opções para fazer o upload das suas imagens para esta plataforma. De uma olhada no endereço abaixo, que mostra as opções para realizar este trabalhado em um app Angular. É claro que você pode enviar a imagem para o back e a partir dai enviar para o Cloudinary.

Se você tentar utilizar o widget, apesar de funcionar, há uma limitação, você não consegue sobrescrever uma imagem ou remover do servidor do cloudinary depois de enviado. A documentação diz que se enviar uma imagem com o public_id igual de uma existente, ele não irá funcionar utilizando o widget.

Se você decidir utilizar qualquer forma de enviar suas fotos diretamente pelo navegador, saiba que só é possível enviar, excluir ou alterar não é. E você estará sujeito ao risco de alguém replicar sua configuração e começar a subir imagens na sua conta sem sua autorização.

https://cloudinary.com/documentation/upload_widget

Integrando Angular com o widget — um breve tutorial

Para integrar sua aplicação feita em Angular, inclua no seu index.html o script:

<script src="//widget.cloudinary.com/global/all.js" type="text/javascript"></script>

E na seu componente, que irá abrir o widget utilize o código abaixo:
import {Component, OnInit} from '@angular/core';
...
import {widgetCloudinary} from 'widget.cloudinary';
//truque para enganar o compilador
declare var cloudinary: any;
@Component({
selector: 'app-detalhe-grupo',
templateUrl: './detalhe-grupo.component.html',
styleUrls: ['./detalhe-grupo.component.css']
})
export class DetalheGrupoComponent implements OnInit {
constructor() {
}
openCloudinaryWidget() {
widgetCloudinary['cropping'] = ['custom'];
widgetCloudinary['tags'] = ['capa do grupo'];
widgetCloudinary['folder'] = 'capa_do_grupo';
widgetCloudinary['public_id'] = 'nomeDaImagemNoServidor;
cloudinary.openUploadWidget(widgetCloudinary,
function (error, result) {
console.log('error ', error);
console.log('result ', result);
});
}
}

widget.cloudinary.ts

export const widgetCloudinary = {
// https://cloudinary.com/documentation/upload_widget
cloud_name: 'seu_cloud_name_cadastrado_na_plataforma',
upload_preset: 'x7px2byr', //crie o seu preset, não é automático

multiple: false,
max_files: 1,
show_powered_by: false,
resource_type: 'image',
sources: ['local', 'url'],
text: {
'powered_by_cloudinary': 'Portal da inovação',
'sources.local.title': 'Meus arquivos',
'sources.local.drop_file': 'Arraste o arquivo aqui',
'sources.local.drop_files': 'Arraste os arquivos aqui',
'sources.local.drop_or': 'ou',
'sources.local.select_file': 'Selecione o Arquivo',
'sources.local.select_files': 'Arquivos',
'sources.url.title': 'Endereço Web',
'sources.url.note': 'Endereço publico da imagem',
'sources.url.upload': 'Upload',
'sources.url.error': 'Please type a valid HTTP URL.',
'sources.camera.title': 'Camera',
'sources.camera.note': 'Tenha certeza que seu navegador está habilitado para capturar fotos, posicione-se em frente a camera e capture a foto:',
'sources.camera.capture': 'Capture',
'progress.uploading': 'Uploading...',
'progress.upload_cropped': 'Upload',
'progress.processing': 'Processando...',
'progress.retry_upload': 'Tente novamente',
'progress.use_succeeded': 'OK',
'progress.failed_note': 'Some of your images failed uploading.'
}
};

Utilizando as configurações do widget.cloudinary.ts você irá abrir o widget com o visual abaixo:

Ao escolher a imagem, você obterá uma resposta como esta:

Após o upload você poderá conferir se a imagem subiu para a plataforma olhando o Media Library, depois de logado na plataforma é claro ;P

Minha experiência ao recuperar a imagem utilizando a API em Java e a biblioteca em Angular

Para listar, recuperar, utilizar as transformações de imagens você tem o projeto oficial chamado: cloudinary_angular disponível. É claro que você precisará salvar o retorno do upload para conseguir recuperar a imagem, você pode tentar utilizar a biblioteca para Angular.

Devido a desatualização da documentação, em meus testes, preferi fazer a recuperação e manipulação da imagem via backend utilizando a API em Java de maneira a obter uma url e então exibir no front escrito em Angular. Não vou descrever a API em Java aqui, pro texto não ficar muito grande, se você tiver interesse me escreve que faço outro post destinado a isto.

Conclusão

É um serviço robusto, rápido, escalável, e particularmente, não conheço outro melhor no seu segmento. A manipulação de imagens é rápida e fácil de ser utilizada.

Porem……

Se você quer substituir uma imagem ou apagar uma existente, não utilize o widget, é necessário criar o seu backend pra isto.

A documentação do cloudinary é confusa, algumas coisas não funcionam como está na documentação, precisa de experimentação e as vezes olhar o fonte da api deles.

O suporte a integração com Angular é ruim, não consegui fazer funcionar com oque tem na documentação e o código de exemplo não roda 100%, a estratégia de versionamento da api é ruim por levar a versão do angular no nome do projeto.

A integração com Java e NodeJS funciona bem pode utilizar com tranquilidade.

Gostou? Quer saber mais sobre Angular? Conheça um dos meus cursos disponíveis….

Quanto mais melhor

--

--