如何在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
相关产品推荐
相关产品推荐

