Pregunta

¿Cómo puedo hacer que la carga de archivos de varias partes utilizando el componente HTTP Apache Camel?

¿Fue útil?

Solución

No sé es posible enviar formularios de varios ejemplares mediante el componente de HTTP.

Si necesita la solución, puede crear POJO primavera Bean que utiliza el cliente de Apache HTTP (y su MultipartPostMethod). A continuación, puede dirigir su mensaje a ese frijol:

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

Otros consejos

Mientras su cuerpo del mensaje está en formato multipart / form-data, se puede utilizar el componente http camello a publicarla en otro servidor. El truco es configurar el tipo de contenido correctamente y establecer el método de petición para ser 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>

Obviamente, el cuerpo ejemplo anterior no es tan útil porque es todos los datos estáticos. Hay un número de maneras que usted puede construir el cuerpo - que he usado dar salida XSLT en modo texto, una expresión de secuencias de comandos (por ejemplo ... ), y un grano de primavera. XSLT funciona bien cuando el cuerpo de mensaje entrante ya es 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>

Usted tiene que tener cuidado con espacios en blanco extra, sin embargo. Esperamos que esto ayude!

Había trabajando en un proyecto web por debajo de características:

  1. Formulario de acceso: las personas registren y se puede cargar el archivo; (Camel: embarcadero, HTTP, JDBC)

  2. Formulario de Subida; subir servlet: si la gente puede iniciar sesión; puede cargar el archivo XML a ftp o servidor web; (Camel: archivo)

3.File es validado por mi archivo .xsd; (Camel: Validador)

  1. del archivo es comprobado por mi archivo de esquema .xsl; (Camel: XSLT)

Yo era crear proyecto web por mi IDE favorito (IntelliJ IDEA por JetBrains ); Describo parte de mi escenario con el código fuente y espero que esto sea útil ☺

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>

En primer lugar hay que crear la base de datos y la tabla de inicio de sesión; a continuación, añadir algunos datos de muestra; por ejemplo, agregar estos archivos:

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) prueba de 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

A continuación, puede utilizar bases de datos integradas como derby, H2, MySQL u otros. Añadir a continuación config para el archivo de configuración de 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) camello-context.xml

Ahora, puede ejecutar su proyecto; antes de hacer eso hay que añadir esta ruta a su contexto camello:

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

Al ejecutar nuestro proyecto; página index.html se muestra y se puede poner las cajas de texto de nombre de usuario y contraseña y enviar su formulario.

En realidad camello estaba escuchando a este puerto embarcadero y consiguió su información posterior. Usted puede obtener esta información de cabecera de camello como '$ {} in.header.user'.

Como se puede ver, me puse mi consulta de selección en el cuerpo de camello, Así, el resultado de selección también se almacenan en el cuerpo de camello. Quiero leer mi resultado y tengo algunas decisiones, por esta razón, añado procesador de camello como a continuación:

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

}

En LoginProcessor he comprobado el cuerpo y si nombre de usuario y la contraseña de entrada son válidos; Añadir propiedad de la cabecera del camello y nombrado por ‘nombre’ por el nombre del campo de la tabla. se establezca lo contrario valor nulo en propiedad de la cabecera del camello.

Volver al archivo de contexto XML camello y continuar la ruta. Si el encabezado del camello es nulo; redirigir el usuario a la página fail.html; de lo contrario redirigir a la página que conseguir el archivo de usuario (archivo.html).

Nota: la propiedad bridgeEndpoint Está tratando de ajustar el punto final http ser bridgeEndpoint lo que significa la petición de URL se actualizará con URI de la solicitud.

¿Tiene que ser el uso de camello?

Apache FileUpload hace esto, sencillamente, http://commons.apache.org/fileupload/using .html

¿Podrían presentar más detalles, ¿cómo pretenden alcanzar impreso de varias copias de camello Apache?

En caso de que haber alguna forma en una página web que se envía directamente a la ruta del camello? O cola AMQ? Te sugiero que comprobar Apache HTTP y componentes Apache Jetty .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top