轉載請注明原文地址: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方法插入一條新記錄即可。
