2017-03-03 2 views
0

Ich möchte eine mehrteilige Datei hochladen, die eine Datei und einige JSON enthält und die Datei in einem lokalen Ordner mit Kamel Rest dsl ausgeben.Multipart-Datei mit Kamel Rest DSL hochladen

ich einen Prozessor in der Strecke bin mit der mehrteiligen Anforderung in die Teile zu spalten mit HttpServletRequest.getPart() jedoch erhalte ich folgende Fehlermeldung:

java.lang.IllegalStateException: No multipart config for servlet 

Ich habe ein MultiPartFilter zum Servlet hinzugefügt und habe versucht mit und ohne MultipartResolver Bean. Wenn ich den Prozessor debugge, kann ich sehen, dass das Request-Objekt HttpServletRequest tatsächlich ein MultiPartFilter $ Wrapper ist, aber die Ausnahme immer noch auftritt.

Upload-Formular in HTML-Seite:

<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> 

Strecke die Anforderung zu verarbeiten:

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

Die Anfrage:

------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 
} 

In 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> 

Mehrteiliger Resolver in Kamel context.xml:

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

für mich exchange.getIn (HttpMessage.class); returns null immer – gstackoverflow

+0

verwandte Frage: https://stackoverflow.com/questions/46930494/camel-saves-full-http-request-but-i-want-only-attached-file – gstackoverflow

Antwort

0

Überprüfen Sie, ob die Anforderung mehrteiliger, wenn es fügen Sie Ihre Konfiguration auf die Anfrage ist:

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

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

+0

Danke, das hat meine ursprüngliche Ausgabe von behoben die IllegalStateException aber jetzt erhalte ich eine IOException: Fehlender Inhalt für mehrteilige Anfrage .. Erraten etwas liest die Anfrage, bevor es an den Prozessor, aber ich bin mir nicht sicher, was. – Sian

+0

@Sian, ich habe auch das gleiche Problem von "IOException: Fehlender Inhalt für mehrteilige Anfrage". Hast du irgendeine Lösung gefunden? –