转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9307319.html
一:odoo后端上传附件
odoo中的ir.attachment模型是附件模型,可以用一个字段关联到该模型,从而达到保存附件的功能。
例如:
advert_attachment = fields.Many2one('ir.attachment', string=u'广告视频')
之后,在form视图中编辑该字段时,就可以从attachment模型的记录中选取已上传的附件文件,或者新建一条attachment记录来上传附件。
二:其他系统的前端网页、Webapp、移动app下载或访问附件
ir.attachment模型对应的数据库表是:ir_attachment
查看该表的字段,我们发现其中最重要的字段主要以下几个:
id:记录id,唯一。 name:上传附件时,为该记录的命名。 datas_fname:上传附件的本来文件名,含后缀名。 datas:隐藏字段,数据库表中看不到该字段,但是代码中可以通过该字段取到附件在数据库中存储的二进制数据串。 复制代码
知道了附件的存储形式,那么访问的思路就有了:
通过id或者name属性,查询ir_attachment表,得到对应的记录对象;
访问记录对象的datas字段,获取附件的二进制数据;
odoo是以base64的格式保存附件的,所以我们也通过base64解码附件的二进制数据;
最后,我们通过IO流来传输数据回前端、webapp、移动端:
#需要导入以下两个模块 from cStringIO import StringIO import base64 #在controller中,把数据流以文件形式返回 data = StringIO(base64.standard_b64decode(记录.datas)) //用base64把二进制数据解码,作为参数创建StringIO流。 return http.send_file(data,filename=记录['datas_fname'],as_attachment=True) //用http.send_file把IO流返回客户端
三:非odoo系统的前端网页、webapp、移动app向odoo上传附件文件
使用文件上传插件把文件数据流传输到controller,并把一些必要字段值如name、datas_fname等传过来;
在controller的方法中,调用ir.attachment模型等write方法插入一条新记录即可。