轉載請註明原文地址:https://www.cnblogs.com/cnodoo/p/9307319.html html
odoo中的ir.attachment模型是附件模型,能夠用一個字段關聯到該模型,從而達到保存附件的功能。前端
例如:web
advert_attachment = fields.Many2one('ir.attachment', string=u'廣告視頻')
以後,在form視圖中編輯該字段時,就能夠從attachment模型的記錄中選取已上傳的附件文件,或者新建一條attachment記錄來上傳附件。數據庫
ir.attachment模型對應的數據庫表是:ir_attachment後端
查看該表的字段,咱們發現其中最重要的字段主要如下幾個:app
id:記錄id,惟一。 name:上傳附件時,爲該記錄的命名。 datas_fname:上傳附件的原本文件名,含後綴名。 datas:隱藏字段,數據庫表中看不到該字段,可是代碼中能夠經過該字段取到附件在數據庫中存儲的二進制數據串。 複製代碼
知道了附件的存儲形式,那麼訪問的思路就有了:webapp
經過id或者name屬性,查詢ir_attachment表,獲得對應的記錄對象;插件
訪問記錄對象的datas字段,獲取附件的二進制數據;code
odoo是以base64的格式保存附件的,因此咱們也經過base64解碼附件的二進制數據;orm
最後,咱們經過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流返回客戶端
使用文件上傳插件把文件數據流傳輸到controller,並把一些必要字段值如name、datas_fname等傳過來;
在controller的方法中,調用ir.attachment模型等write方法插入一條新記錄便可。