Este addon define un nuevo tipo de campo FSFile, que es un campo de archivo que almacena un archivo en un sistema de archivos externo en lugar del filestore de odoo. Esto es útil para archivos grandes que no deseas almacenar en el filestore. Además, el valor del campo te proporciona una interfaz para acceder al contenido y a los metadatos del archivo.
Traducción automática al español (DeepSeek) de la descripción original de OCA, que está en inglés.
auto_awesome Qué hace este módulo
Generado por IA a partir del código · Odoo 18.0Añade un nuevo tipo de campo que almacena archivos en un sistema de archivos externo en lugar del filestore interno de Odoo, con un widget de subida/descarga/eliminación en los formularios. Útil para archivos grandes.
Este módulo proporciona un nuevo tipo de campo de archivo para los desarrolladores de Odoo. En lugar de mantener el contenido del archivo dentro del propio almacenamiento de archivos de Odoo, el archivo se guarda en un almacenamiento externo del sistema de archivos, que se adapta mejor a archivos grandes.
En pantalla, el campo aparece como un widget de archivo: cuando está vacío muestra un botón "Upload your file"; una vez que hay un archivo presente muestra el nombre del archivo como un enlace de descarga, además de pequeños botones de lápiz (editar/reemplazar) y papelera (borrar). Los archivos se pueden subir, reemplazar y eliminar directamente desde el formulario.
Entre bastidores, cada archivo está vinculado a un registro ir.attachment, y el campo expone información útil como el nombre del archivo, el tamaño, el tipo (mimetype) y una URL para acceder a él. La lectura del campo siempre devuelve esta información en lugar del contenido sin procesar.
Reglas de negocio y comportamientos automáticos: el campo solo acepta bytes, un diccionario con filename y contenido en base64, un objeto similar a un archivo, o un valor de archivo existente; de lo contrario, genera un error. Cuando se escribe un archivo, se crea o actualiza un adjunto automáticamente; cuando se borra el valor, se elimina el adjunto relacionado. El nombre del archivo se puede forzar a través de la clave de contexto fs_filename al subir bytes sin procesar.
Modifica el modelo ir.attachment y añade el tipo de campo fs_file al cliente web. No se añaden menús ni informes.
Depende de
Lo necesitan otros módulos
Texto generado por IA (DeepSeek) al leer el código de la versión 18.0 en GitHub; puede contener errores, así que verifícalo en el código antes de decidir. Ver el código en GitHub
Disponibilidad por versión
Revisado: 2026-11-03Estado de confirmación: 3 confirmadas, 6 sin información de 9 versiones.
Fuentes · Odoo 18.0
Confirmado el 2026-11-03 en la rama 18.0 de OCA/storage.
terminal Instalación y uso
Documentación de OCA · Odoo 18.0El nuevo campo FSFile se ha desarrollado para permitirle almacenar archivos en un almacenamiento de sistema de archivos externo. Su diseño se basa en los siguientes principios:
- El contenido del archivo debe leerse desde el sistema de archivos solo cuando sea necesario.
- Debe ser posible manipular el contenido del archivo como un stream por defecto.
- A diferencia del campo Binary de Odoo, el contenido es el contenido del archivo sin procesar por defecto (sin codificación base64).
- Para permitir el intercambio del contenido del archivo con otros sistemas, es posible escribir el contenido como base64. La operación de lectura devolverá una estructura json con el nombre del archivo, el mimetype, el tamaño y una url para descargar el archivo.
Este diseño permite minimizar el consumo de memoria del servidor al manipular archivos grandes e intercambiarlos con otros sistemas a través de la interfaz jsonrpc por defecto.
Concretamente, este diseño le permite escribir código como este:
from IO import BytesIO
from odoo import models, fields
from odoo.addons.fs_file.fields import FSFile
class MyModel(models.Model):
_name = 'my.model'
name = fields.Char()
file = FSFile()
# Create a new record with a raw content
my_model = MyModel.create({
'name': 'My File',
'file': BytesIO(b"content"),
})
assert(my_model.file.read() == b"content")
# Create a new record with a base64 encoded content
my_model = MyModel.create({
'name': 'My File',
'file': b"content".encode('base64'),
})
assert(my_model.file.read() == b"content")
# Create a new record with a file content
my_model = MyModel.create({
'name': 'My File',
'file': open('my_file.txt', 'rb'),
})
assert(my_model.file.read() == b"content")
assert(my_model.file.name == "my_file.txt")
# create a record with a file content as base64 encoded and a filename
# This method is useful to create a record from a file uploaded
# through the web interface.
my_model = MyModel.create({
'name': 'My File',
'file': {
'filename': 'my_file.txt',
'content': base64.b64encode(b"content"),
},
})
assert(my_model.file.read() == b"content")
assert(my_model.file.name == "my_file.txt")
# write the content of the file as base64 encoded and a filename
# This method is useful to update a record from a file uploaded
# through the web interface.
my_model.write({
'file': {
'name': 'my_file.txt',
'file': base64.b64encode(b"content"),
},
})
# the call to read() will return a json structure with the filename,
# the mimetype, the size and a url to download the file.
info = my_model.file.read()
assert(info["file"] == {
"filename": "my_file.txt",
"mimetype": "text/plain",
"size": 7,
"url": "/web/content/1234/my_file.txt",
})
# use the field as a file stream
# In such a case, the content is read from the filesystem without being
# stored in memory.
with my_model.file.open("rb) as f:
assert(f.read() == b"content")
# use the field as a file stream to write the content
# In such a case, the content is written to the filesystem without being
# stored in memory. This kind of approach is useful to manipulate large
# files and to avoid to use too much memory.
# Transactional behaviour is ensured by the implementation!
with my_model.file.open("wb") as f:
f.write(b"content")Traducción automática al español (DeepSeek) de la documentación original de OCA; los comandos y el código no se traducen. Sin información verificada en OCA: Instalación, Configuración.
Las instrucciones de instalación, el paquete de distribución, las dependencias y los pasos de configuración no se muestran porque todavía no se han verificado en la documentación del módulo para ninguna versión.
Datos importados de GitHub: esta ficha refleja la última revisión del catálogo, no una consulta en directo. Verifica siempre en la documentación del módulo y en staging antes de instalar en producción.