You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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 = 1000
  • web.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:13:11