odoo接入阿里云oss附件存储

odoo接入阿里云oss附件存储

说明

在odoo中,附件存在本地服务器中,由odoo自己做处理,也提供了附件url用于扩展外部存储服务器。本文是用odoo对接阿里云的oss。

代码

odoo在上传文件时,附件字段通常使用挂件(many2many_binary)进行附件上传,会调用http接口,往附件模型里创建一条数据,其中vals[‘datas’]就是base64编码过后的字节数据,我们需要做的就是,把这个字节流数据,上传至oss.

准备

下载oss2模块, 这是阿里云提供的python版本的sdk

pip install oss2

继承修改附件模型的create方法

	@api.model
    def create(self, vals):
        # 重写create方法,在这里上传附件到OSS并更新记录
        if 'datas' in vals and isinstance(vals['datas'], bytes):
            # 上传文件至OSS并更新URL字段
            vals = self._check_contents(vals)
            vals.update(self._get_datas_related_values(
                base64.b64decode(vals['datas'] or b''),
                vals['mimetype']
            ))
            url = self.store_attachment_on_oss(vals['name'], base64.decodebytes(vals['datas']))
            vals['url'] = url
            del vals['datas']
        return super(IrAttachment, self).create(vals)

因为odoo在调用附件的创建方法时,对数据进行了编码操作,oss上传的数据,要求不能编码,所以需要进行解码。

编写上传oss方法

    def store_attachment_on_oss(self, name, file_content, access_token=None):
        # 获取Odoo配置中的OSS相关信息
        access_key_id = config.get('access_key')
        access_key_secret = config.get('access_secret')
        bucket_name = config.get('bucket')
        endpoint = config.get('endpoint')

        auth = oss2.Auth(access_key_id, access_key_secret)
        name_list = name.split('.')
        suffix = name_list[-1]
        new_name = f'{name_list[0]}-{fields.Datetime.now()}.{suffix}'
        endpoint = f'{endpoint}/{suffix}'
        bucket = oss2.Bucket(auth, endpoint, bucket_name)

        try:
            # 上传文件到OSS
            dis = f'attachment'
            result = bucket.put_object(new_name, file_content, headers={'Content-Disposition': dis})
            # 返回存储后的URL
            return result.resp.response.url
        except Exception as e:
            raise UserError(_("文件上传至OSS失败: %s") % str(e))

上述的配置,都写入到odoo.conf文件里,参数怎么获取,可以查阅阿里云oss,
调用put_object上传至oss。完成对接

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Odoo 是一款开源的企业资源规划软件,它提供了完整的后台管理系统和前端展示系统,同时也支持文件的存储和下载。下面就针对 Odoo 的后台与前端文件(附件)的存储与下载进行浅谈。 1. 后台文件存储 Odoo 的后台文件存储主要是通过模型字段来实现的。在模型中,我们可以定义一个二进制字段(binary field),用来存储文件的二进制数据。例如,我们可以在产品模型中添加一个图片字段,用来存储产品的图片数据。定义方式如下: ```python class Product(models.Model): _name = 'product.product' _description = 'Product' name = fields.Char(required=True) image = fields.Binary(string="Image") ``` 当我们上传一个图片时,Odoo 会将图片的二进制数据存储到这个字段中。我们可以在后台管理系统中查看和编辑这个字段的值,并可以在模板中使用这个字段来展示图片。 2. 前端文件存储 Odoo 的前端文件存储主要是通过附件(attachment)来实现的。附件可以是任何类型的文件,例如文档、图片、音频等。在 Odoo 中,我们可以在任何一个模型中添加附件字段(attachment field),用来存储附件数据。例如,我们可以在客户模型中添加一个附件字段,用来存储客户的合同文件数据。定义方式如下: ```python class ResPartner(models.Model): _name = 'res.partner' _description = 'Partner' name = fields.Char(required=True) contract = fields.Many2many('ir.attachment', string="Contract") ``` 当我们上传一个附件时,Odoo 会将附件的数据存储到 ir.attachment 表中,并将附件与当前模型记录关联起来。我们可以在后台管理系统中查看和编辑这些附件,并可以在模板中使用这些附件来提供下载链接。 3. 文件下载 Odoo 提供了多种方式来进行文件下载。在后台管理系统中,我们可以直接点击图片或附件字段来下载对应的文件。在模板中,我们可以使用 Odoo 的文件下载链接来提供下载功能。例如,我们可以在客户列表中展示客户的合同文件,并提供下载链接,代码如下: ```xml <tree string="Partners"> <field name="name"/> <field name="contract" widget="many2many_download"/> </tree> ``` 这里使用了 many2many_download widget 来展示客户的合同文件,并提供下载链接。 以上就是 Odoo 后台与前端文件(附件)的存储与下载的浅谈。Odoo 提供了灵活的文件存储和下载方式,可以满足企业级应用的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值