Como usar o Cloud Storage

Use o Cloud Storage para armazenar e disponibilizar arquivos como filmes, imagens ou outros conteúdos estáticos.

Neste documento, descrevemos como usar a biblioteca de cliente do Google Cloud no seu aplicativo para armazenar e recuperar dados do Cloud Storage.

Antes de começar

  • Siga as instruções em "Hello, World!" para Python no App Engine para configurar o ambiente e o projeto, além de entender como os aplicativos do Python são estruturados no App Engine. Anote e salve o ID do projeto. Você precisará dele para executar o aplicativo de amostra descrito neste documento.

  • Certifique-se de criar um bucket do Cloud Storage para o aplicativo invocando o seguinte comando:

    gsutil mb gs://[YOUR_BUCKET_NAME]
    
  • Configure o bucket como acessível para leitura pública para disponibilização de arquivos:

    gsutil defacl set public-read gs://[YOUR_BUCKET_NAME]
    

Fazer o download da amostra

Para clonar o repositório:

git clone https://github.com/GoogleCloudPlatform/python-docs-samples
cd python-docs-samples/appengine/flexible/storage

Editar a configuração do projeto e instalar as dependências

Em app.yaml, defina GOOGLE_STORAGE_BUCKET. Esse valor é o nome do bucket do Cloud Storage criado anteriormente.

env_variables:
    CLOUD_STORAGE_BUCKET: your-bucket-name

Em requirements.txt, observe que é preciso incluir a biblioteca google-cloud-storage, porque isso fornece as funções do Cloud Storage.

Flask==2.1.0; python_version > '3.6'
Flask==2.0.3; python_version < '3.7'
werkzeug==2.1.2; python_version > '3.6'
werkzeug==2.0.3; python_version < '3.7'
google-cloud-storage==2.0.0; python_version < '3.7'
google-cloud-storage==2.1.0; python_version > '3.6'
gunicorn==20.1.0; python_version > '3.0'
gunicorn==19.10.0; python_version < '3.0'

Código do aplicativo

O aplicativo de amostra apresenta uma página da Web que solicita ao usuário um arquivo para armazenar no Cloud Storage. Quando o usuário seleciona um arquivo e clica em "Enviar", o gerenciador de uploads carrega o conteúdo do arquivo em um blob e o grava no bucket (links em inglês) do Cloud Storage.

Após o upload do arquivo no Cloud Storage, o URL público dele é retornado. É possível usá-lo para disponibilizar o arquivo diretamente do Cloud Storage. Armazene esse valor no app para uso futuro.

import logging
import os
from typing import Union

from flask import Flask, request
from google.cloud import storage

app = Flask(__name__)

# Configure this environment variable via app.yaml
CLOUD_STORAGE_BUCKET = os.environ['CLOUD_STORAGE_BUCKET']

@app.route('/')
def index() -> str:
    return """
<form method="POST" action="/upload" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit">
</form>
"""

@app.route('/upload', methods=['POST'])
def upload() -> str:
    """Process the uploaded file and upload it to Google Cloud Storage."""
    uploaded_file = request.files.get('file')

    if not uploaded_file:
        return 'No file uploaded.', 400

    # Create a Cloud Storage client.
    gcs = storage.Client()

    # Get the bucket that the file will be uploaded to.
    bucket = gcs.get_bucket(CLOUD_STORAGE_BUCKET)

    # Create a new blob and upload the file's content.
    blob = bucket.blob(uploaded_file.filename)

    blob.upload_from_string(
        uploaded_file.read(),
        content_type=uploaded_file.content_type
    )

    # Make the blob public. This is not necessary if the
    # entire bucket is public.
    # See https://cloud.google.com/storage/docs/access-control/making-data-public.
    blob.make_public()

    # The public URL can be used to directly access the uploaded file via HTTP.
    return blob.public_url

@app.errorhandler(500)
def server_error(e: Union[Exception, int]) -> str:
    logging.exception('An error occurred during a request.')
    return """
    An internal error occurred: <pre>{}</pre>
    See logs for full stacktrace.
    """.format(e), 500

if __name__ == '__main__':
    # This is used when running locally. Gunicorn is used to run the
    # application on Google App Engine. See entrypoint in app.yaml.
    app.run(host='127.0.0.1', port=8080, debug=True)

Para saber mais

Consulte a documentação do Cloud Storage para informações completas.