如何在Odoo 11服务器通过Java RPC或其他方式推送记录附件?
如何通过Java RPC向Odoo 11服务器推送附件至指定记录
没问题,我来帮你梳理清楚怎么用Java RPC给Odoo 11的指定记录上传附件。Odoo里所有的附件都存在ir.attachment这个模型里,所以我们的核心操作就是通过RPC调用这个模型的创建方法,把附件关联到目标记录上。下面是具体的步骤和代码示例:
1. 前期准备
- 先给Java项目引入Odoo RPC的依赖,常用的是
odoo-java-api这个库,如果用Maven的话,直接在pom.xml里加这段:
<dependency> <groupId>com.github.trabricks</groupId> <artifactId>odoo-java-api</artifactId> <version>1.0.1</version> </dependency>
- 提前准备好Odoo服务器的地址、数据库名、登录账号密码,还有要上传附件的目标记录的模型(比如客户是
res.partner,销售订单是sale.order)以及对应的记录ID。
2. 核心实现步骤
2.1 建立Odoo连接并完成认证
首先得和Odoo服务器建立连接,登录成功后才能进行后续操作:
import com.github.odoo.OdooClient; import com.github.odoo.models.OdooRecord; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Arrays; import java.util.Base64; import java.util.HashMap; import java.util.Map; public class OdooAttachmentUpload { public static void main(String[] args) { // 替换成你的Odoo配置信息 String odooServerUrl = "http://你的Odoo服务器地址:8069"; String dbName = "你的数据库名"; String username = "你的登录账号"; String password = "你的登录密码"; try (OdooClient client = new OdooClient(odooServerUrl)) { // 登录认证 int userId = client.authenticate(dbName, username, password); if (userId == -1) { System.err.println("登录失败!请检查账号密码或者服务器地址是否正确"); return; } System.out.println("登录成功,当前用户ID:" + userId);
2.2 把本地文件转成Base64编码
Odoo的ir.attachment模型要求附件内容以Base64编码的字符串形式传入,所以我们需要先把本地文件转换成Base64:
// 读取本地文件并转换为Base64编码 String localFilePath = "你要上传的文件路径,比如D:/docs/合同.pdf"; byte[] fileBytes = Files.readAllBytes(Paths.get(localFilePath)); String base64FileContent = Base64.getEncoder().encodeToString(fileBytes);
2.3 构造附件参数并调用创建方法
接下来构造ir.attachment需要的字段,然后调用RPC的create方法完成上传:
// 构造附件的参数 Map<String, Object> attachmentParams = new HashMap<>(); attachmentParams.put("name", "合同文件.pdf"); // 附件在Odoo里显示的名称 attachmentParams.put("res_model", "res.partner"); // 目标记录的模型,比如客户是res.partner attachmentParams.put("res_id", 100); // 目标记录的ID,替换成你要关联的记录ID attachmentParams.put("datas", base64FileContent); // Base64编码的文件内容 attachmentParams.put("type", "binary"); // 固定填binary,表示是二进制附件 // 调用create方法创建附件 OdooRecord createdAttachment = client.executeKw( dbName, userId, password, "ir.attachment", "create", Arrays.asList(attachmentParams) ); System.out.println("附件上传成功!生成的附件ID:" + createdAttachment.getId()); } catch (Exception e) { System.err.println("上传过程出错:"); e.printStackTrace(); } } }
3. 几个关键注意点
- 关联字段必须准确:
res_model和res_id是把附件绑定到目标记录的核心,一定要填对目标记录的模型名称和对应的ID,不然附件会变成无关联的孤立文件。 - Base64编码不能错:如果编码过程出问题,上传后的文件会打不开,建议测试小文件先验证。
- 权限要足够:登录的用户必须有创建
ir.attachment的权限,同时也要能访问目标记录,不然会抛出权限不足的错误。 - 大文件处理:Odoo默认有文件大小限制,如果要上传大文件,需要修改Odoo配置文件里的
max_file_size参数。
要是你不想用第三方RPC库,也可以自己写HTTP请求调用Odoo的JSON-RPC接口,核心逻辑还是一样的:构造包含认证信息、模型、方法、参数的JSON请求体,POST到/jsonrpc端点,附件内容同样要转成Base64。
内容的提问来源于stack exchange,提问作者Rahul Thachilath
相关产品推荐
相关产品推荐

