我目前正在从事 Pentaho PDI 项目,我需要将报告上传到 BA/BI 服务器存储库(URL:***/api/repo/publish/file)。我想通过使用 HTTP Post 步骤和生成请求实体字段的用户定义的 Java 类步骤来实现这一点。但是我没有设法想出一个工作代码。由于我的老板不希望我使用外部库,所以我坚持使用kettle 部署的 org.apache.commons.httpclient 类。我的方法是创建一个包含 FilePart 和 StringParts 的 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 Step 发送。但是服务器对这种方法并不满意。
你们知道我做错了什么吗?
谢谢你的帮助!