2017-03-03 79 views
0

我希望上傳包含文件和一些json的多部分文件,並使用camel rest dsl將文件輸出到本地文件夾。使用駱駝休息上傳multipart文件DSL

我使用的處理器中的路線分割使用多部分請求到部件HttpServletRequest.getPart()但是我收到以下錯誤:

java.lang.IllegalStateException: No multipart config for servlet 

我添加了一個MultiPartFilter到servlet和有嘗試使用和不使用multipartResolver bean。當我調試處理器時,我可以看到HttpServletRequest請求對象實際上是一個MultiPartFilter $ Wrapper,但異常仍在發生。

在HTML頁面中上傳的形式:

<html> 
<body> 
    <form action="http://localhost:8080/content/publish" method="post" enctype="multipart/form-data"> 
     <p> 
      Json: <input type="text" name="json"/> 
     </p> 
     <p> 
      File: <input type="file" name="uploadedFile" multiple="true" /> 
     </p> 
     <input type="submit" value="Upload" /> 
    </form> 
</body> 
</html> 

路線來處理請求:

rest("/content").post("/publish").consumes("multipart/form-data").route().process(new MultipartProcessor()).to("file:src/main/resources/testUpload"); 

請求:

------WebKitFormBoundaryOAiLMJtrA2g4CB32 
Content-Disposition: form-data; name="json" 

{ "json" : "test" } 
------WebKitFormBoundaryOAiLMJtrA2g4CB32 
Content-Disposition: form-data; name="uploadedFile"; filename="test.txt" 
Content-Type: text/plain 


------WebKitFormBoundaryOAiLMJtrA2g4CB32-- 

MultipartProcessor:

@Override 
public void process(Exchange exchange) throws Exception { 
    HttpMessage message = exchange.getIn(HttpMessage.class); 
    HttpServletRequest request = message.getRequest(); 
    Part file = request.getPart("uploadedFile"); 
    // then process to output file 
} 

在web.xml:

<servlet> 
    <display-name>Camel Http Transport Servlet</display-name> 
    <servlet-name>CamelServlet</servlet-name> 
    <servlet-class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
    <servlet-name>CamelServlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
    </servlet-mapping> 

    <filter> 
     <filter-name>MultipartFilter</filter-name> 
     <filter-class>org.eclipse.jetty.servlets.MultiPartFilter</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>MultipartFilter</filter-name> 
     <servlet-name>CamelServlet</servlet-name> 
    </filter-mapping> 
在駱駝的context.xml

multipart解析器:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/> 
+0

我exchange.getIn(HttpMessage.class);總是返回null – gstackoverflow

+0

相關問題:https://stackoverflow.com/questions/46930494/camel-saves-full-http-request-but-i-want-only-attached-file – gstackoverflow

回答

0

檢查的要求是多,如果是你的配置添加到請求:

if (request.getContentType() != null && request.getContentType().startsWith("multipart/form-data")) { 
    request.setAttribute(Request.__MULTIPART_CONFIG_ELEMENT, MULTI_PART_CONFIG); 
} 

來源:http://jetty.4.x6.nabble.com/jetty-users-Enable-multipart-support-in-Handlers-under-Embedded-jetty-without-XML-configs-or-WebAppCt-td4959804.html

+0

謝謝,這已經修復了我原來的問題IllegalStateException但是現在我收到一個IOException:缺少多部分請求的內容..猜猜正在讀取請求之前它到達處理器,但我不知道是什麼。 – Sian

+0

@Sian,我也面臨着「IOException:缺少多部分請求內容」的問題。你有沒有找到解決方案? –