You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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="*")

验证测试

  1. 重启Odoo服务,刷新页面
  2. 点击下载按钮,Chrome等浏览器应能正常触发Zip文件下载
  3. 检查下载的Zip文件是否包含所有指定附件,文件格式是否正常可用

内容的提问来源于stack exchange,提问作者Muhammad Saleem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 13:40:27