# 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 variableALLOWED_META_CONFIG
).
Opciones adicionales:
description:
Una descripcion del contenido del archivo (opcional).public:
Unboleano,
decide si el archivo será publico o privado (opcional, por defectopublico
).metadata:
Unobjeto
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:
- Cloud Storage Client Libraries (opens new window)
- App Engine y Google Cloud Storage (opens new window)
- Subir archivos con Flask (opens new window)
- La sección de issues (opens new window) del BackEndBase
← Firestore Model Utils →