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

如何在Odoo中直接显示Amazon S3图片而无需本地存储?

可以实现!Odoo直接显示Amazon S3存储的产品图片方案

完全可以实现这个需求,不用把图片转成Base64格式存入Odoo数据库。核心思路是在产品模型中新增字段存储S3图片的URL,然后修改前端图片组件的URL生成逻辑,直接返回S3的地址。具体步骤如下:

1. 在产品模型中新增S3 URL存储字段

首先在Odoo的产品模型(比如product.template)里添加一个字符字段,用来保存S3上的图片地址:

from odoo import models, fields

class ProductTemplate(models.Model):
    _inherit = 'product.template'

    s3_image_url = fields.Char(string='S3图片URL')

2. 修改前端图片组件的URL生成逻辑

你提供的FieldBinaryImage是Odoo生成图片URL的核心组件,我们需要重写它的_getImageUrl方法:当字段是我们定义的s3_image_url时,直接返回存储的S3地址;其他字段沿用原有本地图片逻辑:

var FieldBinaryImage = AbstractFieldBinary.extend({
    _getImageUrl: function (model, res_id, field, unique) {
        // 针对S3图片URL字段直接返回S3地址
        if (field === 's3_image_url') {
            const record = this.recordData;
            if (record && record.s3_image_url) {
                return record.s3_image_url;
            }
        }
        // 其他字段保持原有本地图片URL生成逻辑
        const url = session.url('/web/image', {
            model: model,
            id: JSON.stringify(res_id),
            field: field,
            unique: field_utils.format.datetime(unique).replace(/[^0-9]/g, ''),
        });
        console.log("base_url", url);
        return url;
    },
});

3. 视图调整与权限注意事项

  • 在产品的表单/列表视图中,把原来的图片字段替换成s3_image_url,并指定widget="image",确保调用修改后的组件:
    <field name="s3_image_url" widget="image" class="oe_avatar"/>
    
  • S3权限配置:如果是公开访问的图片,需要给S3桶配置正确的CORS规则,允许Odoo所在域名跨域访问;如果是私有桶,要生成带签名的临时URL,同时注意URL的过期时间,必要时在Odoo中定时更新这些签名URL。

内容的提问来源于stack exchange,提问作者M.Hassan Nasir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:03:12