Domanda

Come posso fare l'upload di file in più parti utilizzando il componente HTTP Apache Camel?

È stato utile?

Soluzione

Non so è possibile inviare moduli a più parti utilizzando il componente HTTP.

Se avete bisogno della soluzione, è possibile creare POJO Primavera Bean che utilizza il client HTTP Apache (e la sua MultipartPostMethod). Poi è possibile instradare il messaggio a quella di fagioli:

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

Altri suggerimenti

Fino a quando il corpo del messaggio è in formato multipart / form-data, è possibile utilizzare il componente http Camel di pubblicarlo a un altro server. Il trucco è quello di impostare il Content-Type correttamente e impostare il metodo di richiesta di essere POST:

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

Ovviamente, il corpo dell'esempio non è che utile perché è tutti i dati statici. Ci sono un certo numero di modi si può costruire il corpo - che ho usato XSLT Emissione in modalità testo, un'espressione script (ad esempio ... ), e un bean Spring. XSLT funziona bene quando il corpo del messaggio in entrata è già un documento XML:

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

Si ha bisogno di stare attenti a spazi bianchi in più, però. Spero che questo aiuta!

Avevo lavorando su un progetto web sotto le caratteristiche:

  1. Modulo di Accesso: la gente di accesso e possono caricare il file; (Camel: Gettata, Http, JDBC)

  2. Carica forma; caricare servlet: se le persone possono effettuare il login; possono caricare file XML per server FTP o Web; (Camel: file)

3.File è convalidato dal mio file XSD; (Camel: Validator)

  1. file è stato estratto dal mio file di schema .xsl; (Camel: XSLT)

Sono stato creare il progetto web dal mio IDE preferito (IntelliJ IDEA da JetBrains ); Descrivo parte del mio scenario con il codice sorgente e spero che questo è utile ☺

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>

In primo luogo è necessario creare database e la tabella di login; quindi aggiungere alcuni dati di esempio; per esempio aggiungere questi file:

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 primavera-context.xml

Quindi, è possibile utilizzare i database embedded come derby, H2, mysql o altri. Aggiungere al di sotto di configurazione nel file di configurazione di primavera:

<jdbc:embedded-database id="dataSource" type="H2">
    <jdbc:script location="classpath:schema.sql"/>
    <jdbc:script location="classpath:test-data.sql"/>
</jdbc:embedded-database>

5) cammello context.xml

Ora, è possibile eseguire il progetto; prima di fare questo è necessario aggiungere questa strada per il contesto di cammello:

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

Quando si esegue il nostro progetto; pagina index.html è stato mostrato e si può mettere le caselle di testo nome utente e password e inviare il modulo.

In realtà Camel stato l'ascolto di questo porto molo ed ha ottenuto le informazioni di posta. È possibile ottenere queste informazioni dal colpo di testa di cammello come '$ {} in.header.user'.

Come potete vedere, ho impostato la mia query di selezione in Corpo di Camel, Così il risultato di selezione è il negozio anche nel corpo di Camel. Voglio leggere il mio risultato e preso alcune decisioni, per questo motivo aggiungo processore Camel come di seguito:

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 ho controllato il corpo e se username e password di ingresso sono validi; Aggiungere proprietà colpo di testa di cammello e nominato da ‘nome’ al nome di campo della tabella. In caso contrario, impostare valore nullo nella proprietà colpo di testa di cammello.

Torna al file di contesto XML Camel e continuare il percorso. Se l'intestazione di cammello è nullo; reindirizzare utente a fail.html pagina; altrimenti reindirizzamento alla pagina che ottenere file da utente (file.html).

Nota: immobili bridgeEndpoint Si imposta l'endpoint http essere bridgeEndpoint il che significa che l'URL della richiesta verrà aggiornato con richiesta URI.

Ha a essere utilizzando Camel?

Apache Caricamento file fa questo semplicemente http://commons.apache.org/fileupload/using .html

La prego di fornire maggiori dettagli come si desidera modulo multipart raggiungere cammello apache?

dovrebbe essere una qualche forma su una pagina web che inviano direttamente al percorso cammello? O la coda AMQ? Io suggerirei di controllare Apache HTTP e componenti Apache Jetty .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top