Mule 3.7.0:使用新的 http 连接器和球衣上传多部分文件

Mule 3.7.0: Multipart file upload with new http connector and jersey

我正在升级一个应用程序,该应用程序使用 http 和 jersey 将文件上传到 Mule 3.7.0 并迁移到新的 HTTP 实现。在更新之前,我能够使用以下配置上传文件

<http:connector name="HttpConnector" >
    <service-overrides messageFactory="org.mule.transport.http.HttpMuleMessageFactory"
        sessionHandler="org.mule.session.NullSessionHandler" />
</http:connector>

<flow name="UploadFlow">
    <http:inbound-endpoint address="http://0.0.0.0:8095/sds" connector-ref="HttpConnector"/>
    <jersey:resources>
        <component>
            <spring-object bean="FileUploadResource" />
        </component>
    </jersey:resources>
</flow>

FileUploadResource 在哪里

@POST
@Path("module/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.TEXT_PLAIN)
public Response uploadModule(@FormDataParam("file") final InputStream is,
        @FormDataParam("file") FormDataContentDisposition fileDetails) throws IOException {

    String filename = fileDetails.getFileName();
    .....
}

更新配置如下

<http:listener-config name="HttpListenerConfig" host="0.0.0.0" basePath="/sds" port="8095"/>

<flow name="UploadFlow">
    <http:listener config-ref="HttpListenerConfig" path="/*"/>
    <jersey:resources>
        <component>
            <spring-object bean="FileUploadResource" />
        </component>
    </jersey:resources>
</flow>

并且 FileUploadResource 没有改变。尝试上传文件时,我收到 HTTP 400 Bad Request 错误。将此功能迁移到新实现的正确方法是什么?提前致谢。

上传请求如下:

Host: 192.168.29.129:8095
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://192.168.29.129:8090/mule/
Content-Length: 56068
Content-Type: multipart/form-data; boundary=---------------------------   12776546320886
Origin: http://192.168.29.129:8090
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

没有日志很难知道问题出在哪里。但是,为什么要为此使用运动衫?您只需使用 http 连接器即可在多部分请求中上传文件。查看此页面以获取有关如何构建多部分请求的信息:https://docs.mulesoft.com/mule-user-guide/v/3.7/http-request-connector

如果您仍然有充分的理由继续使用 Jersey,请确保为 Jersey 启用了 jersey 多部分支持(考虑到 Jersey 在 Mule 3.6 中进行了升级)

我通过在 http 侦听器上设置 parseRequest="false" 解决了这个问题

<http:listener config-ref="HttpListenerConfig" path="/*" parseRequest="false"/>