Entenda e configure o serviço de Armazenamento de Objeto
Armazene os arquivos transferidos por upload na instância do serviço de Armazenamento de Objeto
Construa uma interface de procura
Recupere documentos a partir do armazenamento
Implementar no IBM Cloud
Crie um aplicativo de procura e armazenamento de pdf baseado em navegador com serviços do IBM Cloud, Parte 2
Use o serviço de Armazenamento de Objeto para armazenar arquivos
Esse conteúdo é a parte # de # na série: Crie um aplicativo de procura e armazenamento de pdf baseado em navegador com serviços do IBM Cloud, Parte 2
Esse conteúdo é parte da série:Crie um aplicativo de procura e armazenamento de pdf baseado em navegador com serviços do IBM Cloud, Parte 2
Na Parte 1 desta série de artigos, eu mostrei como usar dois serviços importantes: Conversão de Documento e Extração de Palavra-chave. Também mostrei como usar esses serviços em um aplicativo real que permite que os usuários armazenem e indexem de forma inteligente os documentos pdf, para aumentar a eficiência das procuras.
Nesta parte de conclusão, vou introduzir o serviço de Armazenamento de Objeto do IBM Cloud™ que fornece uma infraestrutura de Armazenamento de Objeto confiável e compatível com os padrões. Vou mostrar como usar o serviço com PHP para criar um local ideal para seus uploads de PDF.
"Neste segmento de conclusão, vamos aprimorar a solução de armazenamento de documento, incluindo a procura de palavra-chave e uma recuperação de arquivo pdf e, em seguida, implementá-la no IBM Cloud."
Também vou mostrar como criar um mecanismo de procura que utiliza os índices de texto do MongoDB para permitir a procura de palavra-chave no novo armazenamento de documento e, em seguida, realizar o processo de implementação no IBM Cloud. Continue lendo, ainda tem muito mais!
Execute o aplicativoObtenha o código GitHub
O serviço de Armazenamento de Objeto facilita o armazenamento e a recuperação de dados não estruturados na nuvem do IBM Cloud. Ele oferece suporte para a API OpenStack Swift e segue a hierarquia de três camadas do Swift para organizar dados: contas, contêineres e objetos. Funciona da seguinte forma:
A unidade principal na hierarquia é uma conta. As contas correspondem a usuários. Para acessar uma conta, o usuário deve fornecer credenciais de autenticação.
Uma conta pode hospedar vários contêineres que, em geral, equivalem a pastas ou subdiretórios em um sistema de arquivos tradicional.
Cada contêiner pode armazenar vários objetos que podem ser arquivos ou dados. Os objetos podem ter metadados adicionais definidos pelo usuário. Geralmente, é possível armazenar um número ilimitado de objetos.
Para ver isso em ação, inicialize uma nova instância do serviço de Armazenamento de Objeto no IBM Cloud, efetuando login na sua conta do IBM Cloud. Procure e selecione o serviço Armazenamento de Objeto.
Revise a descrição do serviço e clique para ativá-lo. Assegure-se de que o campo "Conectar a" esteja definido como "Deixar desvinculado" e que você esteja usando o "Plano grátis". Inicialmente, essa instância do serviço é executada em um estado desvinculado. Semelhante à instância do serviço de Conversão de Documento na Parte 1, esse estado desvinculado permite que o aplicativo seja desenvolvido localmente com a própria instância do serviço hospedada remotamente no IBM Cloud.
Figura 1. Inicialização do serviço de Armazenamento de Objeto
A instância do serviço é inicializada e, após a conclusão, é apresentada uma página de informações do serviço. Exiba a barra de navegação à esquerda e clique no link "Credenciais do serviço" para visualizar a URL, a região, o nome de usuário, a senha e outras credenciais da instância do serviço. Anote todas essas credenciais porque elas serão necessárias nas próximas etapas.
Figura 2. Credenciais do serviço de Armazenamento de Objeto
Agora é possível fazer um teste com o serviço de Armazenamento de Objeto usando um cliente REST como o Postman, para enviá-lo algumas solicitações de exemplo. Comece enviando uma solicitação de POST à URL de autenticação para o serviço, com o nome do usuário do serviço e a senha. Se a autenticação for bem-sucedida, o servidor retornará um código de resposta 200 OK e um cabeçalho X-Subject-Token contendo um token de autenticação que deverá ser usado para as próximas solicitações.
Por exemplo, se a URL de autenticação do serviço for https://identity.open.softlayer.com/v3/auth/tokens, envie uma solicitação de POST com um corpo de conteúdo JSON contendo o nome do usuário do serviço e a senha. Caso seja autenticado, a resposta do servidor incluirá um cabeçalho X-Subject-Token contendo um token de autenticação. Aqui está um exemplo de solicitação e resposta:
Figura 3. Exemplo de solicitação e resposta para autenticação do serviço de Armazenamento de Objeto
A resposta também inclui uma série de terminais, um para cada um dos serviços disponíveis nesta implementação do OpenStack. Examine essa série de terminais até encontrar o terminal do serviço de Armazenamento de Objeto, como é mostrado abaixo. Essa URL do terminal será o destino de todas as próximas solicitações.
Figura 4. Terminal do serviço de Armazenamento de Objeto
Com o token de autenticação e a URL do terminal, é possível começar a interagir com o serviço de Armazenamento de Objeto usando a API Swift. Por exemplo, para incluir um novo contêiner, envie uma solicitação de PUT para a URL do terminal, incluindo o nome do novo contêiner no final da URL e lembrando-se de incluir um cabeçalho X-Auth-Token na solicitação com o token de autenticação. Portanto, se a URL do terminal for https://xyz.objectstorage.softlayer.net/AUTH_123, envie uma solicitação de PUT para https://xyz.objectstorage.softlayer.net/AUTH_123/container1, para criar um novo contêiner chamado "container1". Aqui está um exemplo:
Figura 5. Exemplo de solicitação e resposta para criação de contêiner de armazenamento de objeto
Da mesma forma, se você desejar listar todos os contêineres na conta, é possível enviar uma solicitação de GET à URL do terminal correspondente sem nenhum parâmetro, neste exemplo, https://xyz.objectstorage.softlayer.net/AUTH_123, conforme mostrado abaixo:
Figura 6. Exemplo de solicitação e resposta para listagem de contêiner de armazenamento de objeto
Embora seja perfeitamente possível interagir com a API de Armazenamento de Objeto usando solicitações e respostas como as mostradas acima, uma solução mais fácil para desenvolvedores de aplicativo é usar o php-opencloud, um SDK de PHP para implementações baseadas em OpenStack. Esse SDK fornece um wrapper de PHP muito útil para os métodos da API Swift, portanto, basta chamar o método apropriado, por exemplo, createContainer() ou listContainers(). A biblioteca do cliente ficará responsável por formular a solicitação e decodificar a resposta. Porém, para depurar erros e, se desejar, executar alguma operação que ainda não tenha suporte no SDK, você precisará saber o que está acontecendo no plano de fundo.
O pacote do php-opencloud foi incluído no arquivo de dependência do editor, mostrado na Parte 1 deste artigo, portanto, ele já deve estar instalado no seu sistema de desenvolvimento. Antes de usá-lo, copie suas credenciais do serviço de Armazenamento de Objeto para o aplicativo PHP. Edite o arquivo $APP_ROOT/config.php e inclua as credenciais como no exemplo abaixo:
Em seguida, use esta configuração para inicializar um novo cliente OpenStack usando o contêiner DI do Slim, incluindo o código abaixo no arquivo $APP_ROOT/public/index.php:
Finalmente, atualize o manipulador de solicitação de POST /add no mesmo arquivo para usar esse cliente e salve o arquivo pdf atualizado na instância de Armazenamento de Objeto:
Uma parte desse código já foi mostrada na Parte 1: verificando o arquivo transferido por upload, convertendo-o em texto normalizado, extraindo palavras-chave e salvando-as em um banco de dados MongoDB. O restante do código começa com o uso do cliente de Armazenamento de Objeto para listar os contêineres disponíveis usando o método listContainers(). Em seguida, ele examina a lista de contêineres para verificar se existe um contêiner chamado documents e, se não existir, ele chamará o método createContainer() para criar um novo contêiner com esse nome. Ou, se o contêiner já existir, ele usará o método getContainer() para obter uma referência ao contêiner.
Quando uma referência ao contêiner documents for obtida, a próxima etapa será inicializar um novo fluxo a partir do documento pdf transferido por upload. Esse fluxo será passado ao método createObject() do contêiner como parte de uma array de opções, que inclui o nome desejado para o objeto no contêiner. O método createObject() é responsável por transferir e salvar o documento na instância de Armazenamento de Objeto como um objeto nomeado. Como você verá na Etapa 4, é possível usar o nome do objeto como uma chave para recuperar o documento pdf a qualquer momento.
Depois de salvar os documentos e as palavras-chave, resta apenas desenvolver uma interface de procura que permita verificar rapidamente a lista de palavras-chave e encontrar documentos correspondentes.
Agora, lembre-se que as palavras-chave extraídas para cada pdf foram salvas como uma array de elementos de cadeia de caractere na propriedade keywords do documento do MongoDB correspondente. Para facilitar a procura dessa array, inclua o índice do texto na propriedade keywords usando um comando como este abaixo:
Aqui está um exemplo disso usando a interface do MongoLab:
Figura 7. Criação de índice de texto na coleção do MongoDB
Em seguida, inclua uma rota /search e um manipulador de retorno de chamada no aplicativo Slim no arquivo $APP_ROOT/public/index.php, conforme mostrado abaixo:
Esse retorno de chamada manipula as solicitações do terminal da URL /search e verifica se há uma cadeia de caractere de consulta na URL de solicitação. Caso seja encontrada uma cadeia de caractere de consulta, ele inicializará o cliente MongoDB e usará o método find() do cliente para gerar e executar uma consulta de procura do MongoDB no índice do texto. Primeiro, os resultados serão classificados mostrando os documentos com as atualizações mais recentes. O método find() retorna um cursor para essa coleção de resultados, e esse cursor é passado ao script de visualização para exibição.
Aqui está um exemplo desse script de visualização:
Há dois componentes principais nesse script de visualização:
Um formulário de procura que contém um campo de entrada de texto para o usuário inserir uma ou mais palavras-chave. Ao enviar o formulário, os dados inseridos pelo usuário são enviados ao terminal da URL /search como uma solicitação de GET.
Um painel de resultados da procura que itera sobre a coleção de documentos do MongoDB retornada pelo manipulador /search e, para cada documento do resultado, exibe o nome, a descrição e a data da última atualização do documento. Cada entrada também contém um link para o terminal da URL /download que permite que o usuário faça o download do documento pdf correspondente a partir do serviço de Armazenamento de Objeto.
Figura 8. Formulário de procura e resultados
O script de visualização mostrado na seção anterior inclui links para o terminal da URL /download, que deve permitir que os usuários façam download de um documento pdf a partir do serviço de Armazenamento de Objeto. Observe que a URL /download também inclui o nome do documento pdf.
Internamente, o manipulador de retorno de chamada do terminal /download deverá inicializar um novo cliente do Armazenamento de Objeto e, em seguida, usar os métodos do cliente para fazer o download do objeto binário correspondente, usando seu nome como segredo. Em seguida, esse objeto deverá ser enviado ao navegador do usuário como um fluxo para que possa ser salvo localmente.
Aqui está o código para o manipulador /download que executa todas as tarefas acima:
O manipulador acima inicializa um novo cliente do Armazenamento de Objeto e, em seguida, usa os métodos getContainer() e getObject() do cliente para obter uma referência ao contêiner documents e ao objeto especificado na URL de solicitação. Em seguida, ele usará o método download() do cliente para criar um fluxo contendo o arquivo pdf.
O objeto de resposta do Slim é modificado para incluir vários cabeçalhos, incluindo o Content-Type, Content-Dispositione o Content-Length, que informam ao navegador que há um objeto binário a seguir. Em seguida, o fluxo é anexado ao objeto de resposta com o método withBody() e a resposta completa é enviada ao cliente da solicitação.
Neste momento, o aplicativo está concluído e pode ser implementado no IBM Cloud. Para fazer isso, primeiro crie o arquivo manifest do aplicativo em $APP_ROOT/manifest.yml, lembrando-se de usar um nome de host e de aplicativo exclusivo, anexando a ele uma cadeia de caractere aleatória (como suas iniciais).
Por padrão, o buildpack de PHP do Cloud Foundry não inclui a extensão do MongoDB de PHP nem a extensão fileinfo (usada para validar uploads de arquivo pdf), portanto, deve-se configurar o buildpack para ativar essas extensões durante a implementação. Da mesma forma, deve-se configurar o buildpack para usar o diretório público do aplicativo como o diretório do servidor da web. Crie um arquivo $APP_ROOT/.bp-config/options.json com o conteúdo a seguir:
Além disso, se você desejar que as credenciais dos serviços Conversão de Documento e Armazenamento de Objeto sejam obtidas automaticamente do IBM Cloud, atualize o script $APP_ROOT/public/index.php para usar a variável VCAP_SERVICES da seguinte forma:
Agora é possível realizar o push do aplicativo para o IBM Cloud e, em seguida, ligar a ele os serviços de Conversão de Documento e Armazenamento de Objeto inicializados na Parte 1. Lembre-se de usar o ID correto para cada instância de serviço para assegurar-se de que elas sejam ligadas corretamente ao aplicativo.
É possível começar a usar o aplicativo, navegando para o host especificado no manifest do aplicativo, por exemplo, http://pdf-keyword-search-[initials].mybluemix.net. Se aparecer uma página em branco ou outros erros, use o link na parte superior desta seção para depurar o código PHP e descobrir onde está o problema.
Este artigo focou na orquestração de vários serviços do Watson e do IBM Cloud para resolver um problema comum: filtrar rapidamente uma grande coleção de documentos para localizar somente aqueles que correspondem a determinadas palavras-chave. Ao combinar computação cognitiva com um armazenamento e uma infraestrutura em nuvem confiáveis e escaláveis e um pouco de PHP para fazer a ligação, foi demonstrado como é fácil para os desenvolvedores criarem soluções eficientes para procura e armazenamento de documentos na nuvem.
Se desejar experimentar os serviços discutidos neste artigo, comece com a demo live do aplicativo. Lembre-se que se trata de uma demo pública, portanto, tenha cuidado para não fazer upload de informações confidenciais (há também um botão "Reconfigurar sistema" muito útil, para apagar todos os dados transferidos por upload). Em seguida, faça download do código a partir de seu repositório GitHub e analise em detalhes para ver como tudo combina perfeitamente.
Este artigo focou somente um caso de uso específico, mas usando outros serviços do IBM Cloud e do Watson, é possível fazer mais combinações para criar outros aplicativos cognitivos para manipulação de documentos. Consulte os links na parte superior de cada seção para saber mais sobre o serviço de Conversão de Documento do IBM Cloud, a API de Extração de Palavra-chave AlchemyAPI, o serviço de Armazenamento de Objeto do IBM Cloud, a microestrutura Slim e outras ferramentas e técnicas usadas neste artigo. Tenha uma boa codificação!
Referência da API de Armazenamento de Objeto OpenStack
Referência da API de Identidade OpenStack
Documentação do SDK (kit de desenvolvimento de software) de PHP OpenStack
Índices de texto do MongoDB
Depurando erros de PHP no IBM Cloud
Serviço de Armazenamento de Objeto
ArticleID=1035974
ArticleTitle=Crie um aplicativo de procura e armazenamento de pdf baseado em navegador com serviços do IBM Cloud, Parte 2: Use o serviço de Armazenamento de Objeto para armazenar arquivos