Frage

Wie kann ich mehren Datei-Uploads, die Apache Camel HTTP Komponente?

War es hilfreich?

Lösung

Ich weiß nicht, ist es möglich, mehrteiliger Formulare mit der HTTP-Komponente zu senden.

Wenn Sie die Abhilfe benötigen, können Sie POJO Spring-Bean erstellen, die das Apache HTTP-Client verwendet (und seine MultipartPostMethod). Dann können Sie Ihre Route Nachricht an diese Bean:

from("activemq:uploadQueue").to("bean:myApacheHttpClientBean?method=sendMultiPart")

Andere Tipps

Solange Ihr Nachrichtentext in multipart / form-data-Format ist, können Sie die Camel http Komponente verwenden Sie es auf einem 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"

    paul@example.com
    --__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>

Natürlich ist das Beispiel Körper oben nicht so nützlich, weil es alle statischen Daten ist. Es gibt eine Reihe von Möglichkeiten, wie Sie den Körper aufbauen können - ich XSLT Ausgabe im Textmodus verwendet habe, ein Skript Ausdruck (z ... ) und ein Spring-Bean. 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>

Sie müssen vorsichtig über zusätzliche Leerzeichen sein, aber. Hoffe, das hilft!

ich auf einem Web-Projekt hatte Arbeit von unten Features:

  1. Login Form: Menschen anmelden und die Datei laden können; (Camel: Anlegestelle, Http, JDBC)

  2. Upload-Formular; Upload-Servlet: wenn die Leute anmelden können; kann XML-Datei auf FTP oder Web-Server hochladen; (Camel: Datei)

3.file wird durch meine XSD-Datei validiert; (Camel: Validator)

  1. Datei wird von meiner .xsl Schemadatei überprüft; (Camel: XSLT)

war ich Webprojekt von meinen Lieblings-IDE (IntelliJ IDEA von Jetbrains ) erstellen; Ich beschreibe Teil meines Szenario mit Quellcode und hoffen, dass dies nützlich ☺ ist

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>

Als erstes müssen Sie Datenbank und Login-Tabelle erstellen; dann einige Beispieldaten hinzuzufügen; fügen Sie zum Beispiel die folgenden 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 können Sie Embedded-Datenbanken wie Derby, H2, mysql oder andere. 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

Jetzt können Sie Ihr Projekt ausführen; 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; index.html Seite wurde angezeigt und Sie können den Benutzernamen und das Kennwort Textfelder setzen und das Formular senden.

Eigentlich Camel zuhörte dieser Anlegestelle Hafen und bekam Ihre Post Informationen. Sie können diese Informationen von Camel-Header wie '$ {in.header.user}' erhalten.

Wie Sie sehen können, habe ich meine Auswahlabfrage in Camel Körper, also das Auswahlergebnis wird auch in Camel Körper speichern. Ich möchte mein Ergebnis und bekam einige Entscheidungen lesen, aus diesem Grund 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 überprüfte ich den Körper und wenn Eingabe Benutzername und Passwort gültig ist; In Camel Header Eigenschaft und dem Namen von ‚name‘ nach Feldnamen der Tabelle. Ansonsten Nullwert in Camel-Header-Eigenschaft festgelegt.

Zurück zu Camel Kontext XML-Datei und die Route fortsetzen. Wenn Camel-Header ist null; umleiten Benutzer fail.html Seite; umleiten sonst zu Seite, die Datei vom Benutzer (file.html) erhalten.

Hinweis: bridgeEndpoint Eigenschaft Sie sind den HTTP-Endpunkt Einstellung bridgeEndpoint zu sein, die die Anforderungs-URL bedeutet mit Anforderungs-URI aktualisiert werden.

Hat es zu Camel verwenden?

Apache Dateiupload tut dies ganz einfach http://commons.apache.org/fileupload/using .html

Könnten Sie bitte weitere Informationen zur Verfügung stellen wie Sie mehrteiliger Form erreichen Apache Camel wollen?

Sollte es irgendeine Form auf einer Webseite sein, die direkt an Camel Route schicken? Oder AMQ Warteschlange? Ich würde vorschlagen, Sie Überprüfung Apache HTTP und Apache Jetty Komponenten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top