我需要公开一个网络服务,用户可以通过POST请求向我发送PDF文件。 我不想改变这个文件。只需将其存储在云端的容器中即可。
以下是我用来测试服务的卷曲:
curl -X POST -H "Content-type: application/pdf" 'http://localhost:9302/billing/1/storeInvoice/user/0750102626/invoice/666' --data-binary /Users/manu/Desktop/toto.pdf
这是我的流程的XML代码:
<flow name="storebill">
<http:inbound-endpoint exchange-pattern="request-response" host="${inbound.host}" port="9302" path="storeInvoice/" method="POST" contentType="application/pdf"/>
<custom-transformer class="BuildFileNameFromRequestPath" />
<http:outbound-endpoint exchange-pattern="request-response" host="myHost" port="80" path="#[flowVars['fileName']" contentType="application/pdf" method="PUT"/>
<exception-strategy ref="genericExceptionStrategy" />
</flow>
该文件存储在我的openstack容器中,但编码完全错误。 当我下载以前存储的文件时,我无法在笔记本电脑上阅读。
PS:当我在openstack容器中通过curl上传本地PDF时,它编码得很好。
BuildFileNameFromRequestPath转换器的代码:
public class BuildFileNameFromRequestPath extends AbstractMessageTransformer {
public Object transformMessage(MuleMessage message, String outputEncoding) throws BusinessException {
String request = message.getInboundProperty("http.request");
StoreBillInfo result = getRestInfo(request);
if (result != null) {
message.setProperty(VariableNamesConstant.VAR_STOREBILLINFO, result, PropertyScope.INVOCATION);
} else {
throw new BusinessException(ErrorCode.ERR400);
}
try {
System.out.println("length payload : " + message.getPayloadAsBytes().length);
return message.getPayloadAsBytes();
} catch (Exception e) {
throw new BusinessException(ErrorCode.ERR400);
}
}
}
getRestInfo只是从路径中提取一些信息以构造pdf文件名的方法。
答案 0 :(得分:0)
不要使用message.getPayloadAsBytes()
来处理消息有效负载。您没有充分的理由反序列化流,并且可能会破坏编码。
使用带有静态调用set-variable
的MEL表达式的getRestInfo
元素,而不是使用自定义转换器。