【问题标题】:Forwarding a multipart request trough mule esb通过 mule esb 转发多部分请求
【发布时间】:2015-01-13 17:58:13
【问题描述】:

我正在使用 http 出站端点来调用一个单独的服务,该服务需要处理在多部分请求中发送到 mule 的文件。这是一个例子

<http:outbound-endpoint connector-ref="serviceConnector"
                address="http://${serviceHost}:${servicePort}/upload"
                method="POST"
                responseTimeout="${endpointTimeout}"
                mimeType="multipart/form-data">

我遇到的问题是,当调用此服务时,我收到一个 FileUploadException,说请求被拒绝,因为没有找到多部分边界。

我一直在尝试解决这个问题并查看不同的问题,但似乎没有一个可以解决问题。

Mule ESB and "multipart/form-data"

Mule http:outbound-endpoint + multipart/form-data

https://www.mulesoft.org/jira/browse/MULE-6917

我也尝试过改变连接器,就像这个问题中解释的那样:Send file to Mule inbound-endpoint 但没有运气。

有什么想法吗?

谢谢

【问题讨论】:

    标签: xml mule esb multipartform-data endpoint


    【解决方案1】:

    最后,这个问题通过创建一个自定义处理器来解决,该处理器解析传入的请求,将其拆分为多个部分,手动读取部分输入流的字节,并将读取的字节设置为附加到消息的数据源。代码:

     InputStream in = message.getPayload( InputStream.class );
     MultiPartInputStream multiIn = new MultiPartInputStream( in, contentType, null );
    try
        {
            Collection<Part> parts = multiIn.getParts();
    
            for ( Part part : parts )
            {
               if ( part instanceof MultiPart )
                    {
                        is = part.getInputStream();
                        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
                        byte[] isByteArray = new byte[1024];
                        int numberRead;
                        while ( (numberRead = is.read( isByteArray ) ) != -1 ){
                            buffer.write(isByteArray, 0, numberRead);
                        }
                        byte[] bytesRead = buffer.toByteArray();
                        DataHandler attachment = new DataHandler(new ByteArrayDataSource( bytesRead, "application/octet-stream")); 
                        message.addOutboundAttachment( part.getName(), attachment );
                    }
             }
       }...handle exceptions etc...
    

    希望这对某人有所帮助!

    【讨论】:

      【解决方案2】:

      您没有展示足够多的流程来真正确定缺少什么,但乍一看,我会说您没有在出站请求 Content-Type 标头中设置 boundary 属性。

      阅读以下内容以更好地了解multipart/form-data 请求的工作原理:http://chxo.com/be2/20050724_93bf.html

      【讨论】:

      • 感谢大卫的回复!除了一些记录器和响应构建器之外,流程中没有太多剩余。这是消息中Content-Type 标头的值:Content-Type=multipart/form-data; boundary=----WebKitFormBoundaryLzHwJdbCLdUuFvR2。我已经从邮递员休息客户端执行了这个请求,我得到了同样的错误,说没有找到边界。我应该在我的 mule 流程中包含什么特别的东西,以使从出站连接器发送的请求与来自 mule 的请求相同?谢谢!
      • 根据您的说法,我认为您缺少一个复制属性消息处理器,用于将入站属性中收到的 HTTP 标头复制到出站范围。见stackoverflow.com/a/6552437/387927
      • 添加复制属性处理器后,我设法发布了请求 - 并得到了一个不同的异常:)。首先,我尝试复制 Content-Type 和 Content-Length 标头值,但在这种情况下,请求超时,如果我复制 Content 类型,则仅成功发布请求,但 tomcat 返回错误消息“请求由客户端在语法上不正确”。我应该复制其他一些标题属性吗?我也尝试复制整个 http.headers 值,但没有给出任何结果。谢谢!
      • 在目标应用程序中进行一些调试和请求拦截后,我注意到应该包含文件的哈希映射和多部分请求的文本部分是空的,这让我相信也许我也应该复制消息的有效负载?
      • 由于您没有显示您的 HTTP 连接器是如何配置的,也没有显示您的流,因此假设您不对入站 HTTP 有效负载执行任何操作并将其作为流接收。如果此假设正确,则应在出站 HTTP 端点中按原样使用流式负载。所以应该不需要对有效载荷做任何事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      相关资源
      最近更新 更多