# Storage

El BackEndBase, permite almacenar archivos usando Google Cloud Storage (opens new window), ó secure_filename de werkzeug.utils (si se ejecuta en un servidor personalizado) a traves del módulo app.ext.storage, para ello se requiere de la siguiente información:

Si va a utilizar Google Cloud Storage (opens new window) en en un servidor personalizado, ó en modo local, recuerde utilizar una cuenta de servicio (opens new window)

# Configuración

En el archivo app/config/storage.py se establece el tamaño maximo, por archivo a almacenar, las extensiones permitidas, el nombre del segmento por defecto y la url para las descargas publicas (usando Google Cloud Storage) necesarios para el correcto funcionamiento del módulo.

# app/config/mail.py

# Maximum file size: 30Mb default
MAX_FILE_SIZE = 29 * 1024 * 1024

# file extensions allowed
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif', 'bmp', 'txt', 'csv', 'xls', 'xlsx', 'doc', 'docx', 'pdf', 'zip'])

ALLOWED_META_CONFIG = set(['images', 'documents'])

# folder name for gae
DEFAULT_BUCKET = "awesome-bucket-project"
PUBLIC_URI = 'https://storage.googleapis.com'

# Cargando archivos

El BackEndBase, cuenta con un servicio de carga de archivos que sigue la configuración establecida arriba.

Para más información consulte el archivo app/ext/storage/__init__.py

Actualmente existen dos formas de manejar la carga de los archivos:

# Legacy

Este metodo es el tradicional y usa Google Cloud Storage (opens new window), ó secure_filename dependiendo el entorno que se utilice.

Si va a utilizar Google Cloud Storage (opens new window) tenga en cuenta que el tamaño maximo del archivo no debe superar los 30 Mb.

El módulo app.ext.storage expone la clase StorageFile utilizada para el almacenamiento de los archivos.

El método de clase save_file, espera al menos tres parametros: file_name, content_file_name y file_content_type

  • file_name: El nombre del archivo a almacenar.
  • content_file_name: el contenido del archivo en sí.
  • file_content_type: es la propiedad de cabecera (header) del archivo usada para indicar el media type del recurso.
@staticmethod
def save_file(file_name=None, content_file_name=None, file_content_type=None, options=None):
    ...

ejemplo:

url: https://awesome-backend.appspot.com/api/upload/legacy
metodo: POST
enctype: multipart/form-data
parametros_requeridos: file (campo del archivo a subir)
parametros_adicionales: meta_data (opcional, información extra que se envía con el archivo)

Sí el archivo que se está cargando, pasa las validaciones respectivas(tamaño y extensiones establecidas), el resultado de la carga es un json con la siguiente información:

El campo meta_data, devolverá la informacion enviada a traves del parametro meta_data de la función save_file, en caso contrario, devolverá null

{
    "data": {
        "storage_id": 5668600916475904,
        "url": "https://storage.googleapis.com/PROJECT_NAME/DEFAULT_BUCKET/super_cat_20180228142009.png",
        "is_public": true,
        "meta_data": {
            "lang":"en"
        }
    },
    "message": "success!",
    "status": 200
}

# Google Cloud

def save_file(file_name=None, blob_content=None, file_content_type=None, meta_data=None, folder_path=None, make_public=False, from_origin=None, save_log=True, options=None):

# Vía Firebase

Este metodo no carga un archivo, más bien ayuda a su gestión una vez cargado, vía Firebase Storage (opens new window)

Recomendamos usar esta alternativa ya que no limita la carga de un archivo de gran tamaño (hasta 5Tb (opens new window)).

Recuerda que el archivo será cargado por Firebase upload (opens new window)

ejemplo:

url: https://awesome-backend.appspot.com/api/upload
metodo: POST
Content-Type: application/json

json de envío:

{
	"bucket_path": "general/reviews-sample.xlsx",
	"original_name": "reviews-sample.xlsx",
	"generated_name": "reviews-sample.xlsx",
	"category": "datasource",
	"description": "reviews-sample-V26-7"
}

donde:

  • bucket_path: El nombre del segmento por defecto.
  • original_name: El nombre del archivo.
  • generated_name: El nombre del archivo generado por el servicio de carga externo (opcional).
  • category: La categoría del archivo (ver la variable ALLOWED_META_CONFIG).

Opciones adicionales:

  • description: Una descripcion del contenido del archivo (opcional).
  • public: Un boleano, decide si el archivo será publico o privado (opcional, por defecto publico).
  • metadata: Un objeto con opciones adicionales.

La respuesta del servicio:

{
  "data": {
    "is_public": false,
    "meta_data": false,
    "storage_id": "tlGIZwBgGvBpstJo3Fsx",
    "url": "general/reviews-sample.xlsx"
  },
  "message": "the file was uploaded successfully",
  "status": 201
}

Este método de gestión de archivos cargados, utiliza Cloud Task (opens new window), para gestionar el archivo, dependiendo la categoría. La respuesta enviada al usuario, es asíncrona, por lo que es responsabilida del desarrollador avisarle al usuario, cuando el archivo se procese correctamente.

# Más información

Para mas información consulte: