使用 Pentaho PDI (Kettle) 将报告上传到 BA 服务器
Upload report to BA server with Pentaho PDI (Kettle)
我目前正在处理 Pentaho PDI 项目,我需要将报告上传到 BA/BI 服务器存储库 (URL: ***/api/repo/publish/file)。我想通过使用 HTTP Post 步骤和生成请求实体字段的用户定义 Java Class 步骤来实现此目的。
但是我没能想出一个有效的代码。由于我的老板不希望我使用外部库,所以我坚持使用 kettle 部署的 org.apache.commons.httpclient 类。
我的方法是创建一个包含 FilePart 和 StringPart 的 Part[] 数组。下一步是创建一个 MultipartRequestEntity,然后将其写入 ByteArrayOutputStream。
File filePart = new File(fileReport);FilePart fileUpload = new FilePart("fileUpload", filePart);
StringPart applyAclPermissions = new StringPart("applyAclPermissions","true");
StringPart overwriteAclPermissions = new StringPart("overwriteAclPermissions","true");
StringPart overwriteFile = new StringPart("overwriteFile", "true");
StringPart logLevel = new StringPart("logLevel","TRACE");
StringPart retainOwnership = new StringPart("retainOwnership", "false");
StringPart fileNameOverride = new StringPart("fileNameOverride","blablub.prpt");
StringPart importDir = new StringPart("importDir", "/public");
Part[] parts = {
fileUpload,
overwriteFile,
logLevel,
retainOwnership,
fileNameOverride,
importDir
};
HttpMethodParams params = new HttpMethodParams();
MultipartRequestEntity requestEntity = new MultipartRequestEntity(
parts, params
);
ByteArrayOutputStream bOutput = new ByteArrayOutputStream();
requestEntity.writeRequest(bOutput);
String requestEntityValue = new String(bOutput.toByteArray());
String contentType = requestEntity.getContentType();
String contentLength = String.valueOf(requestEntity.getContentLength());
Object[] outputRow = createOutputRow(r, data.outputRowMeta.size());
get(Fields.Out, "requestEntityValue").setValue(outputRow, requestEntityValue);
get(Fields.Out, "contentType").setValue(outputRow, contentType);
get(Fields.Out, "contentLength").setValue(outputRow, contentLength);
putRow(data.outputRowMeta, outputRow);
return true;
在下一步中,数据通过 HTTP Post 步骤发送。然而服务器并不满意这种做法。
你们知道我做错了什么吗?
感谢您的帮助!
从5.4开始,有一个专门用于与BA服务器交互的插件:https://github.com/pentaho/pdi-platform-utils-plugin。强烈推荐你看看。
至于自己实现上传,您可以查看插件源,或者,例如,来自 Pentaho Report Designer 的实用程序:https://github.com/pentaho/pentaho-reporting/blob/master/libraries/libpensol/source/org/pentaho/reporting/libraries/pensol/PublishRestUtil.java
希望这会有所帮助。
我目前正在处理 Pentaho PDI 项目,我需要将报告上传到 BA/BI 服务器存储库 (URL: ***/api/repo/publish/file)。我想通过使用 HTTP Post 步骤和生成请求实体字段的用户定义 Java Class 步骤来实现此目的。 但是我没能想出一个有效的代码。由于我的老板不希望我使用外部库,所以我坚持使用 kettle 部署的 org.apache.commons.httpclient 类。 我的方法是创建一个包含 FilePart 和 StringPart 的 Part[] 数组。下一步是创建一个 MultipartRequestEntity,然后将其写入 ByteArrayOutputStream。
File filePart = new File(fileReport);FilePart fileUpload = new FilePart("fileUpload", filePart);
StringPart applyAclPermissions = new StringPart("applyAclPermissions","true");
StringPart overwriteAclPermissions = new StringPart("overwriteAclPermissions","true");
StringPart overwriteFile = new StringPart("overwriteFile", "true");
StringPart logLevel = new StringPart("logLevel","TRACE");
StringPart retainOwnership = new StringPart("retainOwnership", "false");
StringPart fileNameOverride = new StringPart("fileNameOverride","blablub.prpt");
StringPart importDir = new StringPart("importDir", "/public");
Part[] parts = {
fileUpload,
overwriteFile,
logLevel,
retainOwnership,
fileNameOverride,
importDir
};
HttpMethodParams params = new HttpMethodParams();
MultipartRequestEntity requestEntity = new MultipartRequestEntity(
parts, params
);
ByteArrayOutputStream bOutput = new ByteArrayOutputStream();
requestEntity.writeRequest(bOutput);
String requestEntityValue = new String(bOutput.toByteArray());
String contentType = requestEntity.getContentType();
String contentLength = String.valueOf(requestEntity.getContentLength());
Object[] outputRow = createOutputRow(r, data.outputRowMeta.size());
get(Fields.Out, "requestEntityValue").setValue(outputRow, requestEntityValue);
get(Fields.Out, "contentType").setValue(outputRow, contentType);
get(Fields.Out, "contentLength").setValue(outputRow, contentLength);
putRow(data.outputRowMeta, outputRow);
return true;
在下一步中,数据通过 HTTP Post 步骤发送。然而服务器并不满意这种做法。
你们知道我做错了什么吗?
感谢您的帮助!
从5.4开始,有一个专门用于与BA服务器交互的插件:https://github.com/pentaho/pdi-platform-utils-plugin。强烈推荐你看看。
至于自己实现上传,您可以查看插件源,或者,例如,来自 Pentaho Report Designer 的实用程序:https://github.com/pentaho/pentaho-reporting/blob/master/libraries/libpensol/source/org/pentaho/reporting/libraries/pensol/PublishRestUtil.java
希望这会有所帮助。