Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将odoo映像存储到文件系统中_Python_Odoo_Odoo 11 - Fatal编程技术网

Python 将odoo映像存储到文件系统中

Python 将odoo映像存储到文件系统中,python,odoo,odoo-11,Python,Odoo,Odoo 11,希望所有的堆栈成员都是好的。我可以用代码获取产品图像的二进制数据 p_ids=self.env.context.get('active_ids') produtc_templates = self.env['product.template'] for p_id in p_ids: binaryData = produtc_templates.search([('id', '=',p_id)]).image data=base64.b64decode(binaryData)

希望所有的堆栈成员都是好的。我可以用代码获取产品图像的二进制数据

p_ids=self.env.context.get('active_ids')
produtc_templates = self.env['product.template']
for p_id in p_ids:
 binaryData = produtc_templates.search([('id', '=',p_id)]).image 
 data=base64.b64decode(binaryData)
        file="marketplaces/rakuten_ftp/static/imageToSave_"+str(p_id)+".png"
        with open(file, "wb") as imgFile:
            imgFile.write(data)
上面的代码是从二进制数据创建文件,但我无法在mimetype基上应用条件。因为当我查询带有产品id的ir_附件表时,它返回False

for p_id in p_ids:
 attachments = self.env['ir.attachment']
 mimetype=attachments.search([('res_id','=',p_id)])

我正在考虑将res_id作为产品id。但odoo未能找到任何与该id对应的记录。因此,如果有人知道如何根据我的产品id获取mimetype,请帮助我

您的代码看起来不错!但根据
ir.attachement
对象,二进制数据存储在
datas
字段中。所以,您可以使用该数据将二进制数据解码为图像文件

已尝试将以下代码转换为odoov11。&它是从存储在
datas
字段中的二进制数据创建的新图像文件

product_image = self.env['ir.attachment']
product_images = product_image.search([('id', 'in', p_ids)])
for rec in product_images:
    with open("imageToSave.jpg", "wb") as imgFile:
        imgFile.write(base64.b64decode(rec.datas))
您还可以为
mimetype
添加条件,因为
p\u id
可以包含多个id,所以只取那些具有
mimetype
of
image/jpeg
image/png

编辑#1 下面的代码片段已通过
odoov11.0检查

import base64
from odoo.tools.mimetypes import guess_mimetype


p_ids = [16, 18, 11, 38, 39, 40]  # Taking random ids of product.template
produtc_templates = self.env['product.template']
for p_id in p_ids:
    binary_data = produtc_templates.search([('id', '=', p_id)]).image
    mimetype = guess_mimetype(base64.b64decode(binary_data))
    file_path = ""
    if mimetype == 'image/png':
        file_path = "/home/Downloads/" + str(p_id) + ".png"
    elif mimetype == 'image/jpeg':
        file_path = "/home/Downloads/" + str(p_id) + ".jpeg"

    if file_path:
        with open(file_path, "wb") as imgFile:
            imgFile.write(base64.b64decode(binary_data))

产品图像不会保存为
ir.attachment
的实例/记录。好吧,也许这已经改变了,但我没有这么快找到任何东西

您可以做的是使用ir.attachment的方法
\u compute\u mimetype()

以下示例未经测试:

def get_mimetype_of_product_image(self,product_id)
product=self.env['product.product'].browse(产品id)
mimetype=self.env['ir.attachment'].\u compute\u mimetype(
{'values':product.image})
返回mimetype

谢谢您的帮助。但是现在我在rakuten_ftp/static/imageToSave.png这个位置找不到我的图像。@HassanALi根据那个代码片段,如果我们没有指定路径,它将保存在同一个目录
odoo
。如果希望新创建的文件位于不同的位置,请指定路径<代码>打开(“/home/flash/Downloads/imageToSave.jpg”,“wb”)作为imgFile:
使用此文件,将在
下载
目录中创建该文件!如何获取mimetype,因为这就是我的做法image=produtc_templates.search([('id','=',p_id)])。图像查找二进制图像,但使用相同的方法我可以查找mimetype。您可以在
ir.attachment
对象中查找
mimetype
字段!!你可以像这样修改你的域<代码>产品图片=产品图片。搜索([('id','in',p_id),''124;',('mimetype','=','image/jpeg'),('mimetype','=','image/png'))产品图片=产品图片。搜索([('id','in',p_id)根据id返回不同的记录。根据RESU id返回False。它是返回应用程序/octa字节。它必须返回png/jpg。而Odoo的“guess mimetype”功能无法猜到好的ENOG:(您可以将图像数据保存到png,不管它最初是png还是jpg
,以imgFile:imgFile.write的形式打开('a.png',wb')(数据)
如果数据是图像数据(无论是png还是jpg),它都可以工作