接收PDF文件并转发它而不改变它

时间:2014-07-08 15:33:32

标签: mule

我需要公开一个网络服务,用户可以通过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文件名的方法。

1 个答案:

答案 0 :(得分:0)

不要使用message.getPayloadAsBytes()来处理消息有效负载。您没有充分的理由反序列化流,并且可能会破坏编码。

使用带有静态调用set-variable的MEL表达式的getRestInfo元素,而不是使用自定义转换器。