Algum tempo atrás precisei aprender a fazer upload de arquivos para o Google Cloud Storage. Uma das coisas que eu gosto de fazer para me ajudar aprender a fazer algo é criar um scriptzinho com o conceito do que quero, sem aplicar em grandes projetos, evitando assim grandes complexidades.

Assim na época eu criei este script simples que faz o upload do arquivo em um bucket do GCS. A primeira coisa que você precisa fazer é ter instalada a biblioteca, para isso temos o bom e velho pip:

pip install --upgrade google-cloud-storage

Depois disso você precisa definir uma variável de ambiente apontando para o arquivo de credenciais do Google Cloud Platform:

export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"

Com a biblioteca instalada e a variável definida podemos executar o script abaixo e fazer upload de arquivos:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
from datetime import timezone, datetime
from typing import BinaryIO
from google.cloud import storage


def upload_file(
    data: BinaryIO, 
    bucket: str, 
    file_path: str,
    link_lifetime: int = 3600
) -> str:
    """
    Função que realiza o upload do arquivo
    """

    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket)

    blob = bucket.blob(file_path)
    blob.upload_from_file(data)  # Faz o upload do arquivo binário e cria um objeto associado ao arquivo

    lifetime = int(
        datetime.now(tz=timezone.utc).timestamp()
    ) + link_lifetime

    # Gera um link para o arquivo com tempo de expiração
    url = blob.generate_signed_url(lifetime)
    
    return

def main():
    bucket = 'meu-pequeno-bucket'  # Bucket name in GCS
    file_name = 'arquivo_legal.pdf'  # Filename

    with open(file_name, 'rb') as f:
        url = upload_file(
            data=f, 
            bucket=bucket, 
            file_path=file_name,
        )

    print(f'URL for file: {url}')


if __name__ == "__main__":
    main()

Esta biblioteca é síncrona e existem alternativas assíncronas bem interessantes e com uma API parecida, mas não igual, vale apena considerar o uso.