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

突然有个需求说需要编写一个上传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 requestsclass 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/filebasesixpdf_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_dispositionpdfhttpheaders = [('Content-Type', 'application/pdf')]return request.make_response(filecontent, headers=pdfhttpheaders)else:return request.not_found()return

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HCIP中期实验

1、该拓扑为公司网络&#xff0c;其中包括公司总部、公司分部以及公司骨干网&#xff0c;不包含运营商公网部分。 2、设备名称均使用拓扑上名称改名&#xff0c;并且区分大小写。 3、整张拓扑均使用私网地址进行配置。 4、整张网络中&#xff0c;运行OSPF协议或者BGP协议的设备…

常见的数据结构(顺序表、顺序表、链表、栈、队列、二叉树)

线性表&#xff08;Linear List&#xff09;  1.什么是线性表 2.线性表的特点 3.线性表的基本运算 顺序表 1.什么是顺序表 2.时间复杂度&#xff1a; 链表 1.什么是链表 2.单向链表 3. 双向链表 4.ArrayList和LinkedList的使用 栈Stack  1.什么是栈  2.栈的基本方法 队列…

AlexNet卷积神经网络-笔记

AlexNet卷积神经网络-笔记 AlexNet卷积神经网络2012年提出 测试结果为&#xff1a; 通过运行结果可以发现&#xff0c; 在眼疾筛查数据集iChallenge-PM上使用AlexNet&#xff0c;loss能有效下降&#xff0c; 经过5个epoch的训练&#xff0c;在验证集上的准确率可以达到94%左右…

Excel 超牛的格式调整汇总——你还在担心你做出来的表不好看吗

Excel格式调整技巧 绘图逆序绘制条形图设置条形图宽度 条件格式透视表上的条件格式 数字格式千分位逗号数字同时显示 K M 数据分列非重复计数区域透视图新增计算列隐藏行列快捷键其他小技巧 绘图 逆序绘制条形图 设置条形图宽度 条件格式 透视表上的条件格式 条件格式随切片…

vue、uniapp直传阿里云文档

前端实现文件上传到oss&#xff08;阿里云&#xff09;适用于vue、react、uni-app&#xff0c;获取视频第一帧图片 用户获取oss配置信息将文件上传到阿里云&#xff0c;保证了安全性和减轻服务器负担。一般文件资源很多直接上传到服务器会加重服务器负担此时可以选择上传到oss&…

Typescript 枚举类型

枚举是用来表示一组明确的可选值列表 // enum是枚举类型的关键字 //枚举如果不设置值&#xff0c;默认从0开始 enum Direction {Up, // 0 Down, // 1 Left, // 2Right // 3} //如果给第一个值赋值为100&#xff0c;则第二、第三第四个都会在第一个的基础上1 分别是101,102…

MySQL数据备份与还原

一、数据备份 1、使用mysqldump命令备份 mysqldump命令将数据库中的数据备份成一个文本文件。表的结构和表中的数据将存储在生成的文本文件中。 mysqldump命令的工作原理很简单。它先查出需要备份的表的结构&#xff0c;再在文本文件中生成一个CREATE语句。然后&#xff0c;将表…

用友和金蝶:管理软件巨头引领企业转型潮流,新技术开始崭露头角

打造企业帝国的管理软件 在当今企业界&#xff0c;管理软件已经成为提高工作效率、优化业务流程的重要工具。 在众多管理软件中&#xff0c;用友和金蝶凭借其卓越的功能和全面的解决方案成为了众多企业的首选。 用友和金蝶的管理软件是国内知名企业管理软件&#xff0c;广泛应…

为什么大多数团队推行自动化测试最后却不了了之?

随着软件行业的快速发展&#xff0c;接口测试用例在软件开发中扮演着越来越重要的角色。自动化测试作为软件测试的一个重要分支&#xff0c;一般可以提高测试效率和质量&#xff0c;节约测试成本和时间&#xff0c;但是在实际推行过程中&#xff0c;大多数团队最终却难以持续实…

vue3+uniapp自定义tabbar

首先把tabbar中的元素写在一个list中用v-for进行渲染 用一个interface进行定义接口&#xff0c;这样别人在review你的代码就可以清晰知道你的tabbar包含什么元素。 利用typescript特性进行类型定义&#xff0c;可以省去很多麻烦 import { reactive } from "vue" imp…

CentOS 项目发出一篇奇怪的博文

导读最近&#xff0c;在红帽限制其 RHEL 源代码的访问之后&#xff0c;整个社区围绕这件事发生了很多事情。 CentOS 项目发出一篇奇怪的博文 周五&#xff0c;CentOS 项目董事会发出了一篇模糊不清的简短博文&#xff0c;文中称&#xff0c;“发展社区并让人们更容易做出贡献…

SpringBoot搭建WebSocket初始化

1.java后端的maven添加websocket依赖 <!-- websocket依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>2.实例化ServerEndpointExport…

【C语言】初阶结构体

&#x1f388;个人主页&#xff1a;库库的里昂 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&#xff1a;C语言初阶 ✨其他专栏&#xff1a;代码小游戏 &#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论…

敷尔佳IPO首日,仅8名研发人员,“医用面膜第一股“是智商税?

“医美面膜第一股“来了。 今日(8月1日)&#xff0c;哈尔滨敷尔佳科技发展有限公司(下称“敷尔佳”&#xff0c;301371SZ)正式在深交所挂牌上市。 敷尔佳此次IPO募资净额为18.97亿元&#xff0c;开盘价为80.00元/股&#xff0c;发行价55.68元/股&#xff1b;开盘即涨43.67%。…

caj文件怎么转换成pdf?了解一下这种方法

caj文件怎么转换成pdf&#xff1f;如果你曾经遇到过需要将CAJ文件转换成PDF格式的情况&#xff0c;那么你一定知道这是一件麻烦的事情。幸运的是&#xff0c;现在有许多软件和工具可以帮助你完成这项任务。下面就给大家介绍一款使用工具。 【迅捷PDF转换器】是一款功能强大的工…

⛳ String 字符串的存储原理及常用方法

目录 ⛳ String 字符串的存储原理及常用方法&#x1f3ed; 一&#xff0c;String 对象介绍&#x1f69c;二&#xff0c;String 的内存结构&#x1f4e2; 2.1&#xff0c;创建字符串&#x1f389; 创建字符串的情况&#xff1a;空值创建&#xff1a;非空值创建&#xff1a; Stri…

SpringBoot + Docker 实现一次构建到处运行

一、容器化部署的好处 Docker 作为一种新兴的虚拟化方式&#xff0c;它可以更高效的利用系统资源&#xff0c;不需要进行硬件虚拟以及运行完整操作系统等额外开销。 传统的虚拟机技术启动应用服务往往需要数分钟&#xff0c;而 Docker 容器应用&#xff0c;由于直接运行宿主内…

Linux系统jenkins+newman+postman持续集成环境搭建

1、首先安装nodejs 下载nodejs压缩包&#xff0c;下载地址&#xff1a;nodejs官网下载 建议不用下载最新的&#xff0c;我这里用的是推荐的v12.18版本 下载和解压命令 wget https://nodejs.org/dist/v12.18.3/node-v12.18.3-linux-x64.tar.xz解压安装包&#xff08;记得没有z&…

【实践篇】推荐算法PaaS化探索与实践 | 京东云技术团队

作者&#xff1a;京东零售 崔宁 1. 背景说明 目前&#xff0c;推荐算法部支持了主站、企业业务、全渠道等20业务线的900推荐场景&#xff0c;通过梳理大促运营、各垂直业务线推荐场景的共性需求&#xff0c;对现有推荐算法能力进行沉淀和积累&#xff0c;并通过算法PaaS化打造…

数实融合 产业共创 | 竹云受邀出席“2023湾区数字科技50人论坛”

7月29日&#xff0c;“2023湾区数字科技50人论坛”在深圳湾科技生态园圆满举行&#xff01;本届论坛由深圳市科学技术协会指导&#xff0c;中国鲲鹏产业源头创新中心、湾盟产业创新服务中心主办&#xff0c;深圳市金融攻关基地、广东赛迪工业和信息化研究院、香港科技大学深港协…