Chrome中使用ir.actions.act_url实现Odoo附件Zip下载失败求助
问题解决:Odoo 15打包附件Zip下载在Chrome等浏览器失效
核心问题分析
Firefox能正常下载但Chrome等浏览器失效,主要源于两个关键问题:
- 内存中的Zip文件指针未重置到起始位置,导致Chrome读取不到有效文件内容
ir.actions.act_url未指定打开方式,触发Chrome的下载请求拦截机制
分步修复方案
1. 重置内存文件指针
在调用http.send_file前,必须将BytesIO对象的指针移到文件开头,否则浏览器读取的是空内容。同时优化MIME类型转后缀的逻辑,避免生成异常长后缀:
import base64 from io import BytesIO from zipfile import ZipFile from odoo import http from odoo.http import request class DownloadZipFile(http.Controller): @http.route("/download_attachments/", type="http", auth="user", website=True, cors="*") def download_attachments_vendor_routes(self, **data): attachments_items = request.env["ir.attachment"].sudo().search( [("res_id", "=", data.get('res_id')), ('res_model', '=', 'res.partner'), ('res_field', 'in', ('file_siup', 'surat_dirjen'))]) in_memory = BytesIO() zip_archive = ZipFile(in_memory, "w") # 预定义常见MIME类型与后缀的映射,避免异常后缀 ext_map = { 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': '.docx', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': '.xlsx', 'application/pdf': '.pdf', 'image/png': '.png', 'image/jpeg': '.jpg' } for attachment in attachments_items: ext = ext_map.get(attachment.mimetype, '.' + attachment.mimetype.split('/')[1]) zip_archive.writestr(f"{attachment.name}{ext}", base64.b64decode(attachment.datas)) zip_archive.close() # 关键修复:将文件指针移到起始位置,确保浏览器能读取完整内容 in_memory.seek(0) res = http.send_file(in_memory, filename="LegalDocuments.zip", as_attachment=True) return res
2. 调整按钮跳转行为
修改模型中的download_vendor_attachments方法,添加target="_blank"参数,避免Chrome拦截下载请求:
def download_vendor_attachments(self): return { "type": "ir.actions.act_url", "url": "/download_attachments?res_id={}".format(self.partner_id.id), "target": "_blank", # 新增:在新标签页打开下载链接,绕过浏览器拦截 }
3. 可选:优化路由配置
如果上述修改后仍有问题,可尝试将路由的website参数改为False(非网站场景下),确保响应头更符合标准下载请求:
@http.route("/download_attachments/", type="http", auth="user", website=False, cors="*")
验证测试
- 重启Odoo服务,刷新页面
- 点击下载按钮,Chrome等浏览器应能正常触发Zip文件下载
- 检查下载的Zip文件是否包含所有指定附件,文件格式是否正常可用
内容的提问来源于stack exchange,提问作者Muhammad Saleem
相关产品推荐
相关产品推荐

