Domino Java Agent如何解码文档上下文Request_Content中的POST请求
Domino 9.0.1处理multipart/form-data请求的方案
一、直接解码Request_Content的方法
Domino没有内置multipart解码工具,可借助Java标准库的javax.mail.internet.MimeMultipart处理,步骤如下:
- 先拼接分段的
Request_Content_000...字段(如果存在)成完整字节流; - 用
MimeMultipart解析流,区分普通字段和附件。
代码示例:
Session session = getSession(); AgentContext agentContext = session.getAgentContext(); Document documentContext = agentContext.getDocumentContext(); // 拼接所有Request_Content分段 ByteArrayOutputStream baos = new ByteArrayOutputStream(); int partNum = 0; while (true) { String itemName = partNum == 0 ? "Request_Content" : "Request_Content_" + String.format("%03d", partNum); if (!documentContext.hasItem(itemName)) break; byte[] partBytes = (byte[]) documentContext.getItemValue(itemName).elementAt(0); baos.write(partBytes); partNum++; } byte[] fullContent = baos.toByteArray(); // 解析multipart数据 DataSource ds = new ByteArrayDataSource(fullContent, "multipart/form-data"); MimeMultipart multipart = new MimeMultipart(ds); for (int i = 0; i < multipart.getCount(); i++) { BodyPart part = multipart.getBodyPart(i); // 处理普通字段 if (part.isMimeType("text/plain") || part.isMimeType("text/*")) { String fieldName = ""; // 从Content-Disposition提取字段名 String[] dispParts = part.getHeader("Content-Disposition")[0].split(";"); for (String dispPart : dispParts) { if (dispPart.trim().startsWith("name=")) { fieldName = dispPart.trim().substring(5).replace("\"", ""); break; } } String fieldValue = part.getContent().toString(); // 这里处理字段值 } // 处理附件 else { String fileName = part.getFileName(); InputStream attachmentStream = part.getInputStream(); // 示例:保存附件到新文档 Database db = session.getCurrentDatabase(); Document doc = db.createDocument(); doc.replaceItemValue("Form", "AttachmentForm"); doc.createAttachment(fileName, attachmentStream); doc.save(); } }
Domino 9.0.1自带JavaMail相关jar,无需额外引入。
二、Servlet/HttpServlet方案
Domino 9.0.1支持Servlet引擎,用Servlet处理HTTP请求更原生,直接通过HttpServletRequest的getParts()解析multipart数据,代码更简洁:
示例片段:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); Collection<Part> parts = request.getParts(); for (Part part : parts) { String fieldName = part.getName(); // 普通字段 if (part.getContentType() == null) { String fieldValue = new String(IOUtils.toByteArray(part.getInputStream()), "UTF-8"); // 处理字段 } // 附件 else { String fileName = part.getSubmittedFileName(); InputStream in = part.getInputStream(); // 处理附件 } } }
缺点是需要在Domino中配置Servlet映射,部署比Agent繁琐。
三、xAgent方案
xAgent是可通过URL直接调用的特殊Java Agent,核心处理逻辑和普通Agent一致,还是用MimeMultipart解码Request_Content。但xAgent更适合做HTTP接口,能直接返回自定义响应(JSON/XML等),无需额外配置Servlet。
总结
- 快速实现选Java Agent+MimeMultipart;
- 长期Web服务选Servlet,符合标准开发模式;
- 轻量HTTP接口选xAgent,兼顾Agent的便捷和接口的灵活性。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

