Question

Comment puis-je faire le téléchargement de fichiers utilisant le composant multipart HTTP Apache Camel?

Était-ce utile?

La solution

Je ne sais pas est-il possible d'envoyer des formulaires multipart en utilisant le composant HTTP.

Si vous avez besoin de la solution de contournement, vous pouvez créer POJO Bean Spring qui utilise le client Apache Http (et son MultipartPostMethod). Ensuite, vous pouvez acheminer votre message à ce bean:

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

Autres conseils

Tant que le corps de votre message est en multipart / format form-data, vous pouvez utiliser le composant http Camel à ce poste à un autre serveur. L'astuce est de définir votre type de contenu correctement et définir la méthode de demande pour être 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>

De toute évidence, le corps d'exemple ci-dessus n'est pas utile, car elle est toutes les données statiques. Il y a un certain nombre de façons dont vous pouvez construire le corps - j'ai utilisé délivrer en sortie XSLT en mode texte, une expression scriptée (par exemple ... ), et un grain de printemps. XSLT fonctionne bien lorsque votre corps de message entrant est déjà un document 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>

Vous ne devez faire attention à des espaces supplémentaires, cependant. Espérons que cela aide!

J'avais travaillé sur un projet Web en dessous propose:

  1. Formulaire de connexion: les gens se connecter et peuvent télécharger le fichier; (Camel: jetée, Http, JDBC)

  2. formulaire de téléchargement; servlet télécharger: si les gens peuvent se connecter; peut télécharger le fichier xml à ftp ou serveur web; (Camel: fichier)

3.File est validée par mon fichier xsd; (Camel: Validateur)

  1. Le fichier est vérifié par mon fichier de schéma .xsl; (Camel: XSLT)

J'étais créer projet web par mon IDE favori (IntelliJ IDEA par JetBrains ); Je décris une partie de mon scénario avec le code source et espère que cela est 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>

Tout d'abord, vous devez créer la base de données et une table de connexion; puis ajouter quelques données d'échantillon; par exemple ajouter ces fichiers:

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) à ressort context.xml de configuration

Ensuite, vous pouvez utiliser des bases de données embarquées comme derby, H2, MySQL ou autres. Ajouter ci-dessous config dans votre fichier de configuration du printemps:

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

5) chameau-context.xml

Maintenant, vous pouvez lancer votre projet; avant le faire, vous devez ajouter cette route à votre contexte de chameau:

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

Lorsque vous exécutez notre projet; page index.html a été montré et vous pouvez mettre les zones de texte nom d'utilisateur et mot de passe et envoyer votre formulaire.

En fait, Camel écoutait ce port de la jetée et a vos informations après. Vous pouvez obtenir ces informations par l'en-tête de chameau comme « $ {} in.header.user ».

Comme vous pouvez le voir, je tournerai ma requête de sélection dans le corps de Camel, donc le résultat de sélection est également stocker dans le corps de chameau. Je veux lire mon résultat et a obtenu des décisions, pour cette raison, j'ajouter le processeur Camel comme ci-dessous:

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

}

Dans LoginProcessor j'ai vérifié le corps et si le nom d'utilisateur et mot de passe d'entrée sont valides; Ajouter la propriété d'en-tête de chameau et nommé par « nom » par le nom du champ de la table. Dans le cas contraire mis en valeur nulle dans la propriété d'en-tête de chameau.

Retour au fichier xml contexte Camel et continuer la route. Si l'en-tête de chameau est nul; rediriger l'utilisateur vers la page fail.html; sinon rediriger vers la page qui obtiennent le fichier de l'utilisateur (file.html).

Note: propriété bridgeEndpoint Vous définissez le point final http être bridgeEndpoint ce qui signifie que l'URL de requête sera mise à jour avec l'URI de demande.

-t-il à l'aide de Camel?

Apache fileUpload le fait tout simplement http://commons.apache.org/fileupload/using .html

Pourriez-vous s'il vous plaît fournir plus de détails comment voulez-vous atteindre la forme multipart chameau apache?

Faut-il une forme sur une page Web qui envoient directement à la route Camel? Ou file d'attente AMQ? Je vous suggère de vérifier Apache HTTP et composants d'Apache jetée.

scroll top