如何在Odoo中保持图片/视频原始分辨率?技术求助
解决Odoo媒体附件自动压缩问题的三种方案
方案1:完全停止自动压缩流程
Odoo默认会对上传图片执行压缩处理,核心逻辑在ir.attachment模型的文件创建方法中。要彻底禁用压缩,可通过以下两种方式实现:
方式A:系统参数配置(部分版本适用)
检查系统参数中是否存在web.image_max_width和web.image_max_height,若存在,将其值设为极大数值(如99999),Odoo会判定原始尺寸无需压缩。
方式B:定制代码重写逻辑
若系统参数不生效,需继承ir.attachment模型,重写图片处理核心方法:
from odoo import models, api class IrAttachment(models.Model): _inherit = 'ir.attachment' @api.model def _create_attachment(self, values): # 跳过Odoo默认的图片压缩逻辑 if values.get('mimetype', '').startswith('image/'): values.pop('resize_medium', None) values.pop('resize_large', None) return super()._create_attachment(values)
将上述代码加入自定义模块并安装,上传的图片将保留原始尺寸与分辨率。
方案2:自定义压缩至最大1000px
若需保留压缩但限制最小尺寸为1000px,可修改Odoo的图片处理参数:
步骤1:修改系统参数
在系统参数中设置:
web.image_max_width = 1000web.image_max_height = 1000
此设置会让Odoo将超过1000px的图片压缩至该尺寸,小于等于1000px的图片保持原始大小。
步骤2:强制逻辑重写(可选)
若系统参数未生效,通过代码自定义压缩逻辑:
from odoo import models, api from PIL import Image import io class IrAttachment(models.Model): _inherit = 'ir.attachment' @api.model def _resize_image(self, value, max_width=1000, max_height=1000): # 自定义压缩逻辑,仅缩至1000px if not value or not isinstance(value, bytes): return value try: image = Image.open(io.BytesIO(value)) width, height = image.size if width <= max_width and height <= max_height: return value # 按比例缩放至最大尺寸 ratio = min(max_width/width, max_height/height) new_size = (int(width*ratio), int(height*ratio)) image = image.resize(new_size, Image.Resampling.LANCZOS) buffer = io.BytesIO() image.save(buffer, format=image.format) return buffer.getvalue() except: return value @api.model def _create_attachment(self, values): if values.get('mimetype', '').startswith('image/') and values.get('datas'): values['datas'] = self._resize_image(values['datas']) return super()._create_attachment(values)
方案3:直接存储到本地文件夹(无压缩)
要将媒体文件直接存储到本地文件夹并保留原始质量,需完成以下两步:
步骤1:配置存储位置
在系统参数中设置ir_attachment.location为本地文件夹路径,例如:
file:///opt/odoo/media_files
确保该文件夹对Odoo进程具备读写权限。
步骤2:禁用压缩逻辑
参考方案1的方式B,重写ir.attachment的创建方法,跳过图片压缩,确保原始文件直接写入本地文件夹。
配置完成后,上传的所有媒体文件会直接保存到指定目录,用户可通过文件系统直接访问。
内容的提问来源于stack exchange,提问作者Siddharth Tarpada
相关产品推荐
相关产品推荐

