Wie kann ich mehrteilige Datei-Uploads unter Verwendung des Apache Camel HTTP-Komponenten durchführen?
Antworten
Zu viele Anzeigen?Ich weiß nicht, ob es möglich ist, Mehrfachformulare mit dem HTTP-Komponenten zu senden.
Wenn Sie eine Lösung benötigen, können Sie ein POJO Spring Bean erstellen, das den Apache Http Client verwendet (und dessen MultipartPostMethod
). Dann können Sie Ihre Nachricht an dieses Bean weiterleiten:
from("activemq:uploadQueue").to("bean:myApacheHttpClientBean?method=sendMultiPart")
Solange sich der Nachrichtentext im multipart/form-data-Format befindet, können Sie das Camel-HTTP-Komponente verwenden, um ihn an einen anderen Server zu POSTEN. Der Trick besteht darin, Ihren Content-Type richtig einzustellen und die Anforderungsmethode auf POST zu setzen:
multipart/form-data; boundary="__MyCoolBoundary__"
POST
Offensichtlich ist der obige Beispieltext nicht besonders nützlich, da er nur statische Daten enthält. Es gibt mehrere Möglichkeiten, den Text zu erstellen - ich habe XSLT verwendet, das im Textmodus ausgegeben wurde, einen Skriptausdruck (zum Beispiel ...) und ein Spring-Bean. XSLT funktioniert gut, wenn Ihr eingehender Nachrichtentext bereits ein XML-Dokument ist:
--__MyCoolBoundary__
Content-Disposition: form-data; name="name"
--__MyCoolBoundary__--
Sie müssen jedoch darauf achten, dass zusätzliche Leerzeichen vermieden werden. Hoffentlich hilft Ihnen das weiter!
Ich hatte an einem Webprojekt mit folgenden Funktionen gearbeitet:
-
Anmeldeformular: Personen können sich anmelden und die Datei hochladen; (Camel: Jetty, Http, JDBC)
-
Hochladeformular; Hochladeservlet: Wenn sich Personen anmelden können, können sie eine XML-Datei auf einen FTP- oder Webserver hochladen; (Camel: Datei)
3. Die Datei wird von meiner .xsd-Datei validiert; (Camel: Validator)
- Datei wird von meiner .xsl-Schemasdatei überprüft; (Camel: XSLT)
Ich habe das Webprojekt mit meiner Lieblings-IDE erstellt (IntelliJ IDEA von Jetbrains); Ich habe einen Teil meines Szenarios mit dem Quellcode beschrieben und hoffe, dass dies nützlich ist
1) index.html
Zuerst müssen Sie eine Datenbank und Anmeldetabelle erstellen; fügen Sie dann einige Beispieldaten hinzu; zum Beispiel diese Dateien hinzufügen:
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) Konfigurieren Sie spring-context.xml
Dann können Sie eingebettete Datenbanken wie Derby, H2, MySQL oder andere verwenden. Fügen Sie die folgende Konfiguration zu Ihrer Spring-Konfigurationsdatei hinzu:
5) camel-context.xml
Jetzt können Sie Ihr Projekt ausführen; bevor Sie das tun, müssen Sie diese Route zu Ihrem Camel-Kontext hinzufügen:
select * from contact where USERNAME = '${in.header.user}' and PASSWORD = '${in.header.pass}'
${in.header.name} == null
Wenn Sie Ihr Projekt starten, wird die index.html-Seite angezeigt und Sie können die Benutzername- und Passwort-Textfelder ausfüllen und Ihr Formular senden.
Tatsächlich hat Camel diesem Jetty-Port zugehört und Ihre Postinformationen erhalten. Sie können diese Informationen durch den Camel-Header wie '${in.header.user}' abrufen.
Wie Sie sehen können, habe ich meine SELECT-Abfrage im Body von Camel festgelegt. Daher wird das Abfrageergebnis ebenfalls im Body von Camel gespeichert. Ich möchte mein Ergebnis lesen und einige Entscheidungen treffen. Aus diesem Grund habe ich einen Camel-Prozessor hinzugefügt:
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("Willkommen Benutzer: " + name);
exchange.getOut().setHeader("name",name);
} else {
System.out.println("Benutzername oder Passwort ungültig. ");
exchange.getOut().setHeader("name",null);
}
}
}
In LoginProcessor habe ich den Body überprüft und falls der eingegebene Benutzername und das Passwort gültig sind, setze ich eine Camel-Header-Eigenschaft und benenne sie nach 'name' nach dem Tabellenfeld. Andernfalls wird der Wert null in der Camel-Header-Eigenschaft gesetzt.
Zurück zur Camel-Kontext-XML-Datei und fortsetzen der Route. Wenn der Camel-Header null ist, leiten Sie den Benutzer zur fail.html-Seite um; andernfalls leiten Sie ihn zur Seite weiter, auf der der Benutzer die Datei hochladen kann (file.html).
Hinweis: bridgeEndpoint-Eigenschaft Sie setzen den HTTP-Endpunkt auf bridgeEndpoint, was bedeutet, dass die Anforderungs-URL mit der Anforderungs-URI aktualisiert wird.
Könnten Sie bitte weitere Details bereitstellen, wie Sie das mehrteilige Formular an Apache Camel weiterleiten möchten?
Soll es sich um ein Formular auf einer Webseite handeln, das direkt an die Camel Route sendet? Oder an die AMQ-Warteschlange? Ich würde Ihnen empfehlen, die Apache HTTP und Apache Jetty Komponenten zu überprüfen.