odoo16 上传/下载 文件接口的实现

news2024/11/13 9:06:31

突然有个需求说需要编写一个上传pdf 接口

首先需要准备如下 xx.xx模型 module 部分 如下:

    attachment_count = fields.Integer(compute='_compute_attachment_count', string='附件数量', required=True)
    def _compute_attachment_count(self):
        # 附件数量计算
        attachment_data = self.env['ir.attachment'].read_group(
            [('res_model', '=', 'xx.xx.你的模型'), ('res_id', 'in', self.ids)], ['res_id'], ['res_id'])
        attachment = dict((data['res_id'], data['res_id_count']) for data in attachment_data)
        for expense in self:
            expense.attachment_count = attachment.get(expense.id, 0)

    def attachment_image_preview(self):
        """附件上传"""
        self.ensure_one()
        # domain可以过滤指定的附件类型 (mimetype)
        domain = [('res_model', '=', self._name), ('res_id', '=', self.id)]
        return {
            'domain': domain,
            'res_model': 'ir.attachment',
            'name': u'附件管理',
            'type': 'ir.actions.act_window',
            'view_id': False,
            'view_mode': 'kanban,tree,form',
            'view_type': 'form',
            'limit': 20,
            'context': "{'default_res_model': '%s','default_res_id': %d}" % (self._name, self.id)
        }

view部分 代码如下

                <sheet>

                    <div class="oe_button_box" name="button_box">

                        <button name="attachment_image_preview" type="object" class="oe_stat_button" icon="fa-image">
                            <div class="o_stat_info">
                                <span class="o_stat_text">附件管理</span>
                                <field name="attachment_count"/>
                            </div>
                        </button>

                    </div>

......

</sheet>

效果如下 

好了前期准备完成了  接下来看接口如何实现的

上传接口:

# -*- coding: utf-8 -*-
from odoo import http
import json
from odoo.http import request, Response
import base64
import requests

class pdf_upload_Request(http.Controller):
    error = "系统错误"
    # pdf上传接口
    @http.route("/xx/pdf/upload", type='http', auth="public", csrf=False, method=['POST'], website=True, cors="*")
    def pdf_upload(self, **params):
        print("--pdf上传")
        id = params.get('id', None)  # 订单抬头id  必输项
        filename = params.get('filename', None)  # 文件名称  必输项
        if  id is None:
            back_data = {'code': 300, 'msg': 'id没传入'}
            return (json.dumps(back_data))
        if filename is None:
            back_data = {'code': 300, 'msg': '文件名称为空'}
            return (json.dumps(back_data))
        try:
            id = 1  # 订单抬头id  必输项 我现在给他写死为了测试
            filename = "测试"  # pdf 文件名称
            # pdf_base 文档base64  必须是base64位!!!!!!!
            #测试阶段你可以去自动生成一个测试  https://www.lddgo.net/convert/filebasesix
            pdf_base = "JVBERi0xLjMNCiXi48/=="#这个必须是base64!!!!
            Model = request.env['ir.attachment']
            attachment = Model.sudo().create({
                'name': filename,
                'datas': pdf_base,  #
                'res_model': 'xx.xx.你的模型',  # 你的model,
                'res_id': int(id)
            })
            back_data = {'code': 100, 'msg': '上传成功'}
            return (json.dumps(back_data))
        except Exception as e:
            back_data = {'code': 300, 'msg': '上传失败', 'error': str(e)}
            return (json.dumps(back_data))

下载接口:(我写了两种自己查看哪个符合自己)

第一种方式:

    @http.route("/xx/pdf/download", type='http', auth="public", csrf=False, method=['GET'],website=True, cors="*")
    def pdf_download(self, model='ir.attachment',filename_field='name',mimetype=None, **params):
        print("pdf下载")
        filename = params.get('filename', None)  # 文件名称  必输项
        print("filename==",filename)
        # 第一种实现方式
        # filename = "文件名称"
        record_id = request.env['ir.attachment'].sudo().search([('name', '=', filename),('res_model','=','xx.xx.你的模型')])
        if record_id:
            # print("找到了")
            stream = request.env['ir.binary']._get_stream_from(record_id, 'datas', 'None', filename_field, mimetype)
            send_file_kwargs = {'as_attachment': False}
            return stream.get_response(**send_file_kwargs)
        else:
            back_data = {'code': 300, 'msg': '没找到相关文件名称'}
            return (json.dumps(back_data))

我用postamn请求效果如下

第二种方式:

    # pdf 下载接口
    @http.route("/xx/pdf/download", type='http', auth="public", csrf=False, method=['GET'],
                website=True, cors="*")
    def pdf_download(self, model='ir.attachment', filename_field='name', mimetype=None, **params):
        # 第二种实现方式
        filename = "上传文件名称"
        record_id = request.env['ir.attachment'].sudo().search([('name', '=', filename),('res_model','=','xx.xx.你的模型')])
        attachment = request.env['ir.attachment'].sudo().search_read(
            [('id', '=', int(record_id.id))],
            ["name", "datas", "res_model", "res_id", "type", "url"]
        )
        if attachment:
            attachment = attachment[0]
        else:
            return redirect('/xx/pdf/download')

        res_id = attachment['res_id']
        if attachment["type"] == "url":
            if attachment["url"]:
                return redirect(attachment["url"])
            else:
                return request.not_found()
        elif attachment["datas"]:
            # print("attachment===",attachment["datas"])
            filecontent = base64.b64decode(attachment["datas"])
            from odoo.http import content_disposition
            pdfhttpheaders = [('Content-Type', 'application/pdf')]
            return request.make_response(filecontent, headers=pdfhttpheaders)
        else:
            return request.not_found()
        return

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/835611.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虹科干货 | DevOps 团队为什么独独青睐 Redis Enterprise ?

虹科干货 | DevOps 团队为什么独独青睐 Redis Enterprise &#xff1f; 快速部署是保障成功的 DevOps 的关键要素。虹科Redis Enterprise 提供了一种快速的数据库。 DevOps 团队面临的挑战 提高应用程序处理速度&#xff0c;赢得商业竞争 许多企业中&#xff0c;DevOps 团队&…

工厂模式:简化对象的创建过程

工厂模式&#xff1a;简化对象的创建过程 介绍 在软件开发中&#xff0c;对象的创建是一个常见的操作。通常情况下&#xff0c;我们可以直接使用 new 关键字来创建对象&#xff0c;但是在某些情况下&#xff0c;对象的创建过程可能会比较复杂&#xff0c;涉及到多个步骤或者依…

为生成式AI提速,亚马逊云科技Amazon EC2 P5满足GPU需求

生成式AI&#xff08;Generative AI&#xff09;已经成为全球范围内的一个重要趋势&#xff0c;得到越来越多企业和研究机构的关注和应用。纽约时间7月26日&#xff0c;亚马逊云科技数据库、数据分析和机器学习全球副总裁Swami Sivasubramanian在亚马逊云科技举办的纽约峰会上更…

React Native获取手机屏幕宽高(Dimensions)

import { Dimensions } from react-nativeconsole.log(Dimensions, Dimensions.get(window)) 参考链接&#xff1a; https://www.reactnative.cn/docs/next/dimensions#%E6%96%B9%E6%B3%95 https://chat.xutongbao.top/

程序员自由创业周记#5:加一上线

程序员自由创业周记#5&#xff1a;加一上线 这是一位程序员进行独立开发创业的记录&#xff0c;将分享创业过程中的所思所想以及收支明细。 充实 如果说程序员独立创业的成功率只有5%&#xff0c;那如果家里有一位3岁多还没上幼儿园的小朋友要照顾&#xff0c;成功的概率至少还…

通俗易懂web3.0

目录 前言一、WEB1.0二、WEB2.0三、WEB3.0区别最后 前言 大家好&#xff0c;我是清风。互联网连接了人与人&#xff0c;在过去的30年中&#xff0c;互联网技术不断进化、演化&#xff0c;向纵深发展&#xff0c;政治、经济、社交、生活、工作已经几乎离不开互联网。我们经历了…

软件测试面试【富途面经分享】

目录 一面面经&#xff08;1h&#xff09; 二面面经 一面面经&#xff08;1h&#xff09; 一、对白盒黑盒灰盒测试的理解 答&#xff1a; 1、黑盒测试就当整个程序是个黑盒子&#xff0c;我们看不到它里面做了什么事情&#xff0c;只能通过输入输出看是否能得到我们所需的来…

使用HTTP隧道时如何应对目标网站的反爬虫监测?

在进行网络抓取时&#xff0c;我们常常会遇到目标网站对反爬虫的监测和封禁。为了规避这些风险&#xff0c;使用代理IP成为一种常见的方法。然而&#xff0c;如何应对目标网站的反爬虫监测&#xff0c;既能保证数据的稳定性&#xff0c;又能确保抓取过程的安全性呢&#xff1f;…

亚马逊关键词的作用有哪些?

亚马逊关键词在平台上扮演着重要的作用&#xff0c;涵盖了消费者、卖家和整个平台的多个方面&#xff1a; 1、消费者的作用&#xff1a; 帮助消费者快速找到所需商品&#xff1a;通过输入关键词&#xff0c;消费者可以迅速找到感兴趣的商品&#xff0c;节省时间和精力。 支持…

【Linux】运行程序前加上strace,可以追踪到函数库调用过程

rootubuntu:/home/peng/test# gcc 123.c -o run rootubuntu:/home/peng/test# strace ./run 如执行结果可知&#xff1a; 我们的程序虽然只有一个printf函数&#xff0c;但是在执行过程中&#xff0c;我们前后调用了execve、access、open、fstat、mmap、brk、write等系统调用。…

01_二值图、灰度图、彩色图

01_二值图、灰度图、彩色图 1. 二值图2. 灰度图3. 彩色图 1. 二值图 二值图像&#xff08;黑白图像&#xff09;&#xff1a;每个像素点只有两种可能&#xff0c;0和1&#xff0c;0代表黑色&#xff0c;1代表白色。数据类型通常为1个二进制位。 得出来的图像 2. 灰度图 单…

ad+硬件每日学习十个知识点(22)23.8.2(LDO datasheet手册解读)

文章目录 1.LDO的概述、features2.LDO的绝对参数&#xff08;功率升温和结温&#xff09;3.LDO的引脚功能4.LDO的电气特性5.LDO的典型电路&#xff08;电容不能真用1uF&#xff0c;虽然按比例取输出值&#xff0c;但是R2的取值要考虑释放电流&#xff09;6.LDO的开关速度和线性…

PaperEdge 文档图像矫正

效果 地址&#xff1a; https://github.com/cvlab-stonybrook/PaperEdge

leaflet-uniapp 缩放地图的同时 显示当前缩放层级

记录实现过程&#xff1a; 需求为移动端用户在使用地图时&#xff0c;缩放地图的同时&#xff0c;可以获知地图此时缩放的级别。 效果图如下&#xff1a;此时缩放地图级别为13 map.on() 有对应的诸多行为 查看官网即可&#xff0c;这里根据需要为--zoomstart zoom zoomend 代…

Vector - CAPL - 诊断模块函数(连接管理)

CanTpCreateConnection - 创建TP连接 功能&#xff1a;使用给定的地址模式&#xff08;add人Mode&#xff09;创建新连接&#xff0c;可用于诊断数据的收发。 说明&#xff1a;无法更改已有连接的寻址模式&#xff1b;如果确实有需要&#xff0c;可以关闭当前连接后再创建一个…

首批获得金融级行业云平台认证,天翼云深耕行业云

云计算下半场看什么&#xff1f; 无疑是金融、政务、制造等传统政企用户的上云与用云。随着数字经济发展和产业数字化的提速&#xff0c;上云已是政企用户推动其数字化转型不断深入的重要抓手&#xff0c;成为不可阻挡的趋势。 与互联网用户相比&#xff0c;政企用户上云极为…

Qt5.13引入QtWebApp的模块后报错: error C2440: “reinterpret_cast”: 无法从“int”转换为“quintptr”

1、开发环境 Win10-64 qt5.13 msvc2015-64bit-release 2、报错 新建一个demo工程。 引入QtWebApp的httpserver、logging、templateengine三个模块后。 直接运行&#xff0c;&#xff0c;此时报错如下&#xff1a; E:\Qt5.13.1\install\5.13.1\msvc2015_64\include\QtCore…

在腾讯云服务器OpenCLoudOS系统中安装redis(有图详解)

创建安装目录&#xff1a; mkdir -p /app/soft/redis 2. 下载安装包 进入安装目录 cd /app/soft/redis/ 下载安装包 wget https://download.redis.io/releases/redis-7.0.1.tar.gz 解压&#xff1a; tar -zxvf redis-7.0.1.tar.gz 安装gcc yum install gcc-c 进入re…

JSON:让数据传输更优雅

在东南亚海滩的阳光下&#xff0c;时而有一些贝壳、手工艺品等迷人的商品吸引着你。然而&#xff0c;语言的障碍有时会成为购买商品的阻碍。不得不用手比划以及尝试各种办法来进行交流。幸运的是&#xff0c;人们找到原始沟通的技巧&#xff0c;让彼此都能接受的信息交流方式&a…

ES6 - 对象新增的一些常用方法

文章目录 1&#xff0c;Object.is()2&#xff0c;Object.asign()3&#xff0c;Object.getOwnPropertyDescriptors()4&#xff0c;Object.setPrototypeOf()和getPrototypeOf()5&#xff0c;Object.keys()、values() 和 entries()6&#xff0c;Object.fromEntries()7&#xff0c;…