¿Cómo puedo hacer cargas de archivos de varias partes utilizando el componente HTTP Apache Camel?Publicación HTTP de varias copias de Apache Camel (carga de archivos)
Respuesta
no sé es posible el envío de formularios de varios ejemplares que utilizan el componente de HTTP.
Si necesita la solución alternativa, puede crear POJO Spring Bean que utiliza Apache Http Client (y su MultipartPostMethod
). A continuación, puede enrutar su mensaje a ese bean:
from("activemq:uploadQueue").to("bean:myApacheHttpClientBean?method=sendMultiPart")
¿Tiene que estar usando Camel?
Apache FileUpload hace esto, sencillamente, http://commons.apache.org/fileupload/using.html
Sí, tiene que ser camello. Además, Apache Fileupload es un componente del lado del servidor. Necesito subir archivos de camello a un servidor que ya sabe cómo procesar cargas de varias partes. He recurrido a encapsular la parte de carga en un bean separado. Hubiera sido bueno, sin embargo, hacerlo funcionar de la caja. –
¿Podría por favor proporcionar más detalles cómo desea que la forma multiparte llegue al camello apache?
¿Debería ser alguna forma en una página web que se envíe directamente a la ruta Camel? ¿O AMQ cola? Sugiero que compruebe Apache HTTP y Apache Jetty componentes.
Siempre que su cuerpo de mensaje esté en formato multipart/form-data, puede usar el componente http de Camel para POSTARLO a 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"
[email protected]
--__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 varias maneras de construir el cuerpo: he utilizado la salida XSLT en modo texto, una expresión con guiones (por ejemplo, < groovy> ... </groovy>) y un Spring bean. 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. ¡Espero que esto ayude!
que había trabajando en un proyecto web por debajo de características:
Formulario de acceso: la gente entra y se puede cargar el archivo; (Camel: Jetty, Http, JDBC)
Cargar formulario; subir servlet: si las personas pueden iniciar sesión; puede cargar archivos xml a ftp o servidor web; (Camel: archivo)
3.El archivo está validado por mi archivo .xsd; (Camel: Validator)
- El archivo es comprobado por mi archivo de esquema .xsl; (Camel: XSLT)
Fui creado 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; luego agrega algunos datos de muestra; por ejemplo añadir 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
Entonces , puede usar bases de datos integradas como derby, H2, mysql u otras. 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 hay que agregar esta ruta a su contexto de 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>
Cuando ejecuta nuestro proyecto; Se mostró la página index.html y puede poner los cuadros de texto de nombre de usuario y contraseña y enviar su formulario.
En realidad, Camel escuchaba este puerto de escolta y obtenía la información de su publicación. Puede obtener esta información por el encabezado de Camel como '$ {in.header.user}'.
Como puedes ver, configuré mi consulta de selección en Camel's Body, por lo que el resultado de la selección también se almacena en Camel's Body. quiero leer mi resultado y tiene algunas decisiones, por esta razón, añado procesador de camello de la siguiente manera:
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 el nombre de usuario y la contraseña son válidos; Agregue la propiedad del encabezado de Camel y su nombre por 'nombre' por nombre de campo de la tabla. De lo contrario, establezca el valor nulo en la propiedad del encabezado de Camel.
Regrese al archivo xml de contexto de Camel y continúe con la ruta. Si el encabezado de Camel es nulo; redireccionar usuario a la página fail.html; de lo contrario, redirija a la página que obtiene el archivo del usuario (archivo.html).
Nota: la propiedad bridgeEndpoint Está configurando el punto final http para ser bridgeEndpoint lo que significa que la URL de solicitud se actualizará con el URI de solicitud.
- 1. Apache Camel http a rutas http (¿Es posible?)
- 2. CÓMO: Archivos de coincidencias de Apache Camel, Regex
- 3. Apache Camel ftp consumidor carga los mismos archivos una y otra vez
- 4. Apache Camel con clúster ActiveMQ
- 5. Apache Camel scripting problem
- 6. Enrutamiento condicional Apache Camel
- 7. JSP - Carga de archivos con Apache Commons
- 8. Carga de archivos de varias partes en Ruby
- 9. Analizando datos de formularios HTTP de varias partes con contenido de carga de archivos usando Scala
- 10. Apache camel alternative in .net?
- 11. Apache Camel para llamadas asincrónicas
- 12. Carga de archivos FTP con HTTP Proxy
- 13. Carga de archivos HTTP asíncronos en cola
- 14. http post con hormiga para la carga de archivos
- 15. Apache Camel: ¿puedo agregar varias declaraciones en la parte de cuándo de la declaración de elección condicional?
- 16. Cómo probar unidades de rutas de producción en Apache Camel?
- 17. Publicación de archivos RDLC
- 18. Apache Camel: ¿Qué marcha con los mensajes?
- 19. Apache Camel - transacción en las rutas
- 20. HTTP vs carga de FTP
- 21. Http POST en Java (con carga de archivos)
- 22. Carga de archivos HTTP de arrastrar y soltar entre navegadores?
- 23. Administración y supervisión de rutas Apache-Camel en ServiceMix
- 24. ¿Cómo? Publicación de formulario en varias ubicaciones
- 25. La publicación HTTP de varias partes de Android no envía el tipo MIME del archivo
- 26. Publicación HTTP segura en Android
- 27. Apache Camel: punto final "directo: inicio": ¿qué significa?
- 28. Publicación de HTTP como IE6 usando C#
- 29. Implementación de varias aplicaciones de django en Apache con mod_wsgi
- 30. Apache Camel: cómo almacenar la variable para un uso posterior
Gracias, eso es lo que esencialmente he hecho. Ahora funciona. –
@KaiSternad: ¿puede explicar cómo lo hizo con cierto detalle? –
@AbhishekRanjan Lo siento, desafortunadamente no recuerdo los detalles. Ha sido un tiempo. –