A API Blobstore permite que a sua aplicação publique objetos de dados, denominados blobs,que são muito maiores do que o tamanho permitido para objetos no serviço Datastore. Os BLOBs são úteis para publicar ficheiros grandes, como ficheiros de vídeo ou de imagem, e para permitir que os utilizadores carreguem ficheiros de dados grandes. Os blobs são criados carregando um ficheiro através de um pedido HTTP. Normalmente, as suas aplicações fazem isto apresentando um formulário com um campo de carregamento de ficheiros ao utilizador. Quando o formulário é enviado, o Blobstore cria um blob a partir do conteúdo do ficheiro e devolve uma referência opaca ao blob, denominada chave do blob,que pode usar posteriormente para publicar o blob. A aplicação pode publicar o valor do objeto BLOB completo em resposta a um pedido do utilizador ou pode ler o valor diretamente através de uma interface de streaming semelhante a um ficheiro.
Apresentamos o Blobstore
O App Engine inclui o serviço Blobstore, que permite que as aplicações forneçam objetos de dados limitados apenas pela quantidade de dados que podem ser carregados ou transferidos através de uma única ligação HTTP. Estes objetos são denominados valores do Blobstore ou blobs. Os valores do Blobstore são fornecidos como respostas dos controladores de pedidos e são criados como carregamentos através de formulários Web. As aplicações não criam dados de blobs diretamente. Em alternativa, os blobs são criados indiretamente por um formulário Web enviado ou outro pedido HTTP POST. Os valores do Blobstore podem ser fornecidos ao utilizador ou acedidos pela aplicação num fluxo semelhante a um ficheiro, através da API Blobstore.
Para pedir a um utilizador que carregue um valor do Blobstore, a sua aplicação apresenta um formulário Web com um campo de carregamento de ficheiros. A aplicação gera o URL de ação do formulário chamando a API Blobstore. O navegador do utilizador carrega o ficheiro diretamente para o Blobstore através do URL gerado. Em seguida, o Blobstore armazena o blob, reescreve o pedido para conter a chave do blob e transmite-o a um caminho na sua aplicação. Um controlador de pedidos nesse caminho na sua aplicação pode realizar o processamento adicional de formulários.
Para publicar um objeto BLOB, a sua aplicação define um cabeçalho na resposta de saída e o App Engine substitui a resposta pelo valor do objeto BLOB.
Não é possível modificar os blobs depois de criados, embora seja possível eliminá-los. Cada blob tem um registo de informações do blob correspondente, armazenado no arquivo de dados, que fornece detalhes sobre o blob, como a hora de criação e o tipo de conteúdo. Pode usar a chave do blob para obter registos de informações de blobs e consultar as respetivas propriedades.
Usar o Blobstore
As aplicações podem usar o Blobstore para aceitar ficheiros grandes como carregamentos de utilizadores e para disponibilizar esses ficheiros. Os ficheiros são denominados blobs assim que são carregados. As aplicações não acedem diretamente aos blobs por
nome de ficheiro. Em vez disso, as aplicações referem-se aos blobs através do tipo appengine.BlobKey.
O utilizador cria um objeto BLOB enviando um formulário HTML que inclui um ou mais campos de entrada de ficheiros. A sua aplicação
define
blobstore.UploadURL
como o destino (ação) deste formulário, transmitindo à função
um caminho de URL de um controlador na sua aplicação. Quando o utilizador envia o formulário,
o navegador do utilizador carrega os ficheiros especificados diretamente para o Blobstore. O Blobstore reescreve o pedido do utilizador e armazena os dados do ficheiro carregado, substituindo os dados do ficheiro carregado por uma ou mais chaves de blobs correspondentes. Em seguida, transmite o pedido reescrito ao controlador no caminho do URL que forneceu a
blobstore.UploadURL
.
Este controlador pode fazer um processamento adicional com base na chave do objeto binário grande. Por último, o controlador tem de devolver uma resposta de redirecionamento apenas com cabeçalhos (301, 302 ou 303), normalmente um redirecionamento do navegador para outra página que indique o estado do carregamento do objeto binário grande.
A aplicação pode ler partes de um valor do Blobstore através de uma interface de streaming semelhante a um ficheiro.
blobstore.Reader.
Carregar um blob
Para criar e carregar um blob, siga este procedimento:
1. Crie um URL de carregamento
Chame
blobstore.UploadURL
para criar um URL de carregamento para o formulário que o utilizador vai preencher,
transmitindo o caminho da aplicação a carregar quando o POST do formulário estiver concluído.
2. Crie um formulário de carregamento
O formulário tem de incluir um campo de carregamento de ficheiros e o enctype do formulário tem de estar definido como multipart/form-data. Quando o utilizador envia o formulário, o POST é processado pela API Blobstore, que cria o blob. A API também cria um registo de informações para o blob e armazena o registo no Datastore, e transmite o pedido reescrito à sua aplicação no caminho indicado como uma chave de blob.
Tem de publicar a página do formulário com um Content-Type de text/html; charset=utf-8 ou os nomes de ficheiros com carateres não ASCII vão ser mal interpretados.
Este é o tipo de conteúdo predefinido no Go, mas tem de se lembrar de o fazer se definir o seu próprio Content-Type.
Não pode usar um Application Load Balancer externo global com um NEG sem servidor para processar pedidos de carregamento enviados para o URL /_ah/upload/ devolvido pela chamada blobstore.create_upload_url. Em alternativa, tem de encaminhar esses pedidos de carregamento diretamente para o serviço do App Engine. Pode fazê-lo através do domínio appspot.com ou de um domínio personalizado mapeado diretamente para o serviço do App Engine.
3. Implemente o controlador de carregamento
Neste controlador, pode armazenar a chave do objeto BLOB com o resto do modelo de dados da sua aplicação. A própria chave do blob permanece acessível a partir da entidade de informações do blob no Datastore. Tenha em atenção que, depois de o utilizador enviar o formulário e o seu controlador ser chamado, o blob já foi guardado e as informações do blob foram adicionadas ao Datastore. Se a sua aplicação não quiser manter o blob, deve eliminá-lo imediatamente para evitar que fique órfão.
Ao reescrever o pedido do utilizador, o Blobstore esvazia as partes MIME dos ficheiros carregados e adiciona a chave do blob como um cabeçalho de parte MIME. O Blobstore preserva todos os outros campos e partes do formulário, transmitindo-os ao controlador de carregamento. Se não especificar um tipo de conteúdo, o Blobstore tenta inferi-lo a partir da extensão do ficheiro. Se não conseguir determinar um tipo de conteúdo, atribui o tipo de conteúdoapplication/octet-stream ao blob recém-criado.
Publicar um blob
Para publicar blobs, tem de incluir um controlador de transferência de blobs como um caminho na sua aplicação.
Este controlador deve transmitir a chave de blob para o blob pretendido a blobstore.Send
. Neste exemplo, a chave do blob é transmitida ao controlador de transferência como o argumento do URL
o argumento URL r.FormValue("blobKey").
Na prática, o controlador de transferência pode obter a chave do objeto BLOB
por qualquer meio que escolher, como através de outro método ou ação do utilizador.
Os blobs podem ser publicados a partir de qualquer URL de aplicação. Para publicar um blob na sua aplicação, coloca um cabeçalho especial na resposta que contém a chave do blob. O App Engine substitui o corpo da resposta pelo conteúdo do blob.
Intervalos de bytes de BLOB
O Blobstore suporta a publicação de parte de um valor grande em vez do valor completo
em resposta a um pedido. Para publicar um valor parcial, inclua o cabeçalho X-AppEngine-BlobRange
na resposta de saída. O seu valor é um intervalo de bytes HTTP padrão. A numeração de bytes baseia-se em zero. Um X-AppEngine-BlobRange
em branco indica à API para ignorar o cabeçalho de intervalo e disponibilizar o blob completo.
Alguns exemplos de intervalos:
0-499publica os primeiros 500 bytes do valor (bytes 0 a 499, inclusive).500-999serve 500 bytes a partir do 501.º byte.500-publica todos os bytes a partir do 501.º byte até ao final do valor.-500publica os últimos 500 bytes do valor.
Se o intervalo de bytes for válido para o valor do Blobstore, o Blobstore envia um código de estado 206 Partial Content e o intervalo de bytes pedido ao cliente. Se o intervalo não for válido para o valor,
o Blobstore envia 416 Requested Range Not Satisfiable.
O Blobstore não suporta vários intervalos de bytes num único pedido (por exemplo,
100-199,200-299), quer se sobreponham ou não.
Aplicação de amostra completa
Está disponível uma app de demonstração do Go 1.11 no GitHub. Tenha em atenção que tem de inserir /v2/ no nome do pacote do Blobstore antigo.
Usar a API Blobstore com o Cloud Storage
Pode usar a Blobstore API para armazenar blobs no Cloud Storage em vez de os armazenar no Blobstore. Tem de configurar um contentor, conforme descrito na documentação do Cloud Storage e especificar o contentor e o nome do ficheiro em UploadURLOptions que fornece à função UploadURL.
No controlador de carregamento, tem de processar o mapa de metadadosdos blobs devolvidos
Também pode publicar objetos do Cloud Storage através da API Blobstore.
Para publicar um objeto do Cloud Storage, use BlobKeyForFile para gerar oblobkey necessário, conforme descrito em
Publicar um blob.
Quotas e limites
O espaço usado para valores do Blobstore contribui para a quota de dados armazenados (faturáveis). As entidades de informações de blobs no Armazenamento de dados são contabilizadas para os limites relacionados com o Armazenamento de dados. Tenha em atenção que o Cloud Storage é um serviço pago. A faturação é feita de acordo com a folha de preços do Cloud Storage.
Para mais informações sobre as quotas de segurança ao nível do sistema, consulte o artigo Quotas.
Além das quotas de segurança ao nível do sistema, os seguintes limites aplicam-se especificamente à utilização do Blobstore:
- O tamanho máximo dos dados do Blobstore que podem ser lidos pela aplicação com uma chamada API é de 32 megabytes.
- O número máximo de ficheiros que podem ser carregados num único POST de formulário é 500.