Wie kann ich mehrteilige Dateiuploads mit der Apache Camel HTTP-Komponente durchführen?Apache Camel Multipart HTTP-Beitrag (Datei-Upload)
Antwort
Ich weiß nicht, ist es möglich, mehrteiliger Formulare mit der HTTP-Komponente zu senden.
Wenn Sie die Problemumgehung benötigen, können Sie POJO Spring Bean erstellen, die den Apache Http Client (und seine MultipartPostMethod
) verwendet. Dann können Sie Ihre Nachricht an diese Bohne weiterleiten:
from("activemq:uploadQueue").to("bean:myApacheHttpClientBean?method=sendMultiPart")
Muss Camel verwendet werden?
Apache Dateiupload tut dies ganz einfach http://commons.apache.org/fileupload/using.html
Ja, es muss Kamel sein. Außerdem ist Apache FileUpload eine serverseitige Komponente. Ich muss Dateien von Camel auf einen Server hochladen, der bereits weiß, wie man Multi-Teil-Uploads verarbeitet. Ich habe den Upload-Teil in eine separate Bean gekapselt. Es wäre aber schön gewesen, wenn es funktioniert hätte. –
Könnten Sie bitte mehr Details zur Verfügung stellen, wie wollen Sie mehrteilige Form erreichen Apache Kamel?
Sollte es ein Formular auf einer Webseite sein, die direkt an Camel Route senden? Oder AMQ-Warteschlange? Ich würde vorschlagen, Sie überprüfen Apache HTTP und Apache Jetty Komponenten.
Solange Ihr Nachrichtentext im Multipart-/Formdatenformat vorliegt, können Sie die Camel http-Komponente verwenden, um sie an einen anderen Server zu senden. Der Trick ist, Ihren Content-Type richtig zu setzen und die Request-Methode gesetzt POST sein:
<route>
<from uri="direct:start"/>
<setBody>
<![CDATA[
--__MyCoolBoundary__
Content-Disposition: form-data; name="name"
Paul Mietz Egli
--__MyCoolBoundary__
Content-Disposition: form-data; name="email"
[email protected]
--__MyCoolBoundary__--
]]>
</setBody>
<setHeader headerName="Content-Type">
<constant>multipart/form-data; boundary="__MyCoolBoundary__"</constant>
</setHeader>
<setHeader headerName="CamelHttpMethod">
<constant>POST</constant>
</setHeader>
<to uri="http://www.example.com/mywebservice.php"/>
</route>
Offensichtlich über das Beispiel Körper nicht so nützlich ist, weil es alle statischen Daten sind. Es gibt eine Reihe von Möglichkeiten, wie Sie den Körper konstruieren können - Ich habe XSLT verwendet, das im Textmodus ausgibt, einen skriptgesteuerten Ausdruck (z. B. < groovy> ... </groovy>) und eine Spring-Bohne. XSLT funktioniert gut, wenn Ihr eingehender Nachrichtentext ist bereits ein XML-Dokument:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
--__MyCoolBoundary__
Content-Disposition: form-data; name="name"
<xsl:value-of select="//name"/>
--__MyCoolBoundary__--
</xsl:stylesheet>
brauchen Sie vorsichtig über zusätzliche Leerzeichen zu sein, aber. Hoffe das hilft!
ich auf einem Web-Projekt gearbeitet hatte von unten Features:
Login Form: Menschen anmelden und die Datei laden können; (Camel: Jetty, Http, JDBC)
Uploadformular; Servlet hochladen: wenn sich Leute einloggen können; kann XML-Datei auf ftp oder Webserver hochladen; (Camel: file)
3.file durch meine XSD-Datei überprüft wird; (Camel: Validator)
- Datei wird von meiner .xsl-Schemadatei überprüft; (Camel: XSLT)
Ich war Webprojekt von meinen Lieblings-IDE (IntelliJ IDEA von Jetbrains) schaffen; Ich beschreibe einen Teil meines Szenarios mit Quellcode und hoffe, das ist nützlich ☺
1) Index.html
<form action="http://0.0.0.0:8080/hello" method="post">
<fieldset title="Login" >
username:<input type="text" id="user" name="user"/>
password:<input type="password" id="pass" name="pass" />
<input type="submit" id="submit" value="submit"/>
</fieldset>
Zuerst Datenbank und Login-Tabelle erstellen haben; Fügen Sie dann einige Beispieldaten hinzu. zum Beispiel fügen Sie diese Dateien:
2) schema.sql
DROP TABLE IF EXISTS CONTACT;
CREATE TABLE CONTACT (
ID INT NOT NULL AUTO_INCREMENT
, NAME VARCHAR(40) NOT NULL
, USERNAME VARCHAR(40) NOT NULL
, PASSWORD VARCHAR(60) NOT NULL
, VERSION INT NOT NULL DEFAULT 0
, UNIQUE UQ_CONTACT_1 (USERNAME)
, PRIMARY KEY (ID));
3) Test-data.sql
insert into contact (name, username, password) values ('ali', 'aliti', '123');
insert into contact (name, username, password) values ('shahab', 'shahab', '147');
insert into contact (name, username, password) values ('farhad', 'farhad', '159');
4) Config feder context.xml
Dann Sie können eingebettete Datenbanken wie Derby, H2, MySQL oder andere verwenden. In unter config Ihrer Feder-Konfigurationsdatei:
<jdbc:embedded-database id="dataSource" type="H2">
<jdbc:script location="classpath:schema.sql"/>
<jdbc:script location="classpath:test-data.sql"/>
</jdbc:embedded-database>
5) Kamel context.xml
Nun Sie Ihr Projekt ausführen können; bevor tun, dass Sie diesen Weg zu Ihrem Kamel Kontext hinzufügen:
<route>
<from uri="jetty:http://0.0.0.0:8080/hello"/>
<setBody>
<simple>
select * from contact where USERNAME = '${in.header.user}' and PASSWORD = '${in.header.pass}'
</simple>
</setBody>
<to uri="jdbc:dataSource"/>
<process ref="loginProcessor"/>
<log message=">>>header: ${in.header.name}"/>
<choice>
<when>
<simple>${in.header.name} == null</simple>
<to uri="jetty://http://localhost:9090/fail.html?bridgeEndpoint=true"/>
</when>
<otherwise>
<to uri="jetty://http://localhost:9090/file.html?bridgeEndpoint=true"/>
</otherwise>
</choice>
Wenn Sie unser Projekt laufen; Die Seite index.html wurde angezeigt und Sie können die Textfelder Benutzername und Passwort eingeben und Ihr Formular senden.
Eigentlich hörte Camel diesen Anlegesteg und bekam Ihre Post Informationen. Sie können diese Informationen von Camels Header wie '$ {in.header.user}' erhalten.
Wie Sie sehen können, habe ich meine Select-Abfrage in Camel's Body gesetzt, damit das ausgewählte Ergebnis auch in Camels Body gespeichert wird. Ich möchte mein Ergebnis und bekam einige Entscheidungen aus diesem Grund lesen füge ich Camel Prozessor wie folgt:
6) LoginProcessor.java
public class LoginProcessor implements Processor {
public void process(Exchange exchange) throws Exception {
int size = ((ArrayList) exchange.getIn().getBody()).size();
if (size > 0) {
Object name = ((LinkedHashMap) (((ArrayList) exchange.getIn().getBody()).get(0))).get("NAME");
System.out.println("welcome user: " + name);
exchange.getOut().setHeader("name",name);
} else {
System.out.println("user or pass are invalid. ");
exchange.getOut().setHeader("name",null);
}
}
}
In LoginProcessor ich den Körper überprüft und wenn Eingabe-Benutzername und Passwort gültig sind; Fügen Sie die Header-Eigenschaft von Camel hinzu und benennen Sie sie nach dem Namen der Tabelle. Andernfalls setzen Sie in der Header-Eigenschaft von Camel den Wert null.
Zurück zu Camel Context XML-Datei und die Route fortsetzen. Wenn der Header von Camel Null ist; Benutzer auf die Seite fail.html umleiten; andernfalls auf die Seite umleiten, die die Datei vom Benutzer abruft (file.html).
Hinweis: bridgeEndpoint-Eigenschaft Sie legen den HTTP-Endpunkt als bridgeEndpoint fest, was bedeutet, dass die Anfrage-URL mit dem Anfrage-URI aktualisiert wird.
- 1. Retrofit (2.0 beta2) Multipart Dateiupload funktioniert nicht
- 2. Apache Camel Multithread Verarbeitung
- 3. Apache Camel MQXAQueueConnectionFactory
- 4. Apache Camel bedingten Routing
- 5. Apache Camel Komponente Parameter
- 6. Apache Camel Routing
- 7. Microservice mit Apache Camel
- 8. Interzeptoren und Apache Camel
- 9. Kündigungsnachricht in Apache Camel
- 10. Strange Apache Camel Exception
- 11. Apache Camel RedisIdempotentRepository Konfiguration
- 12. Apache Camel MultiCasting - InvalidPayloadException
- 13. Apache Camel Split bereichern
- 14. Apache Camel: errorHandler vs onException?
- 15. Apache Camel Produzenten und Verbraucher
- 16. Apache Camel für asynchrone Aufrufe
- 17. Legendes Apache Camel Dynamisches Routing
- 18. Apache Camel: Was marschiert Nachrichten?
- 19. Apache Camel Route Bereitstellung - Unabhängig?
- 20. Embedding Anlegesteg für Apache Camel
- 21. Apache Camel: Verbrauchen von Bean
- 22. Apache Camel 2.13.0 Split Splitter
- 23. Apache Camel: Covert JSON zu einem POJO mit Camel Methoden
- 24. Apache HttpClient machen multipart Formular post
- 25. Timeout in JBI auf Apache Camel
- 26. C# Messaging-Implementierung ähnlich wie Apache Camel
- 27. Benutzerdefinierte JSON Ausgabe in Apache Camel xmljson
- 28. Timer mit Quartz und Apache Camel verwenden
- 29. Wie kann ich Schleife in Apache Camel
- 30. Apache Camel Cache-Konfiguration funktioniert nicht
Danke, das habe ich im Wesentlichen gemacht. Es funktioniert jetzt. –
@KaiSternad: Können Sie erklären, wie Sie es im Detail gemacht haben? –
@AbhishekRanjan Es tut mir leid, leider erinnere ich mich nicht an die Details. Es ist eine Weile her. –