Come posso caricare file multipart utilizzando il componente Apache Camel HTTP?Post HTTP multipartito Apache Camel (caricamento file)
risposta
non so è possibile inviare moduli a più parti utilizzando il componente HTTP.
Se è necessaria la soluzione alternativa, è possibile creare POJO Spring Bean che utilizza Apache Http Client (e il relativo MultipartPostMethod
). Poi si può instradare il messaggio a quella di fagioli:
from("activemq:uploadQueue").to("bean:myApacheHttpClientBean?method=sendMultiPart")
Deve usare Camel?
Apache Caricamento file fa questo semplicemente http://commons.apache.org/fileupload/using.html
Sì, deve essere cammello. Inoltre, Apache Fileupload è un componente lato server. Ho bisogno di caricare file da cammello su un server che già sa come elaborare caricamenti di più parti. Ho fatto ricorso all'incapsulamento della parte di caricamento in un bean separato. Sarebbe stato comunque carino farlo funzionare fuori dagli schemi. –
La prego di fornire maggiori dettagli come vuoi modulo multipart raggiungere cammello apache?
Dovrebbe esserci qualche modulo su una pagina Web che invia direttamente al percorso Camel? O coda AMQ? Ti suggerisco di controllare i componenti Apache HTTP e Apache Jetty.
Fintanto che il corpo del messaggio è in formato multipart/form-data, è possibile utilizzare il componente http Camel per inviarlo a un altro server. Il trucco è 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"
[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>
Ovviamente, il corpo esempio di cui sopra non è che utile, perché è di tutti i dati statici. Esistono diversi modi per costruire il corpo: ho utilizzato l'output XSLT in modalità testo, un'espressione basata su script (ad esempio < groovy> ... </groovy>) 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 ti aiuti!
avevo lavorando su un progetto web sotto le caratteristiche:
Login Form: la gente login e può caricare il file; (Camel: Jetty, Http, JDBC)
Modulo di caricamento; upload servlet: se le persone possono accedere; può caricare file xml su ftp o web server; (Camel: file)
3. File è convalidato dal mio file .xsd; (Camel: Validator)
- Il file è controllato dal file di schema .xsl; (Camel: XSLT)
Sono stato creare un progetto web dal mio IDE preferito (IntelliJ IDEA da Jetbrains); Descrivo parte del mio scenario con codice sorgente e spero che questo sia utile ☺
1) indice.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
Poi , è possibile utilizzare database incorporati 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; è stata mostrata la pagina index.html e puoi inserire le caselle di testo username e password e inviare il modulo.
In realtà Camel stava ascoltando questo porticciolo e ha ricevuto le informazioni sul tuo post. Puoi ottenere queste informazioni dall'intestazione di Camel come "$ {in.header.user}".
Come potete vedere, ho impostato la mia query di selezione in Camel's Body, quindi il risultato selezionato è anche memorizzato in Camel's Body. voglio leggere il mio risultato e ottenuto 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 input sono validi; Aggiungi la proprietà di intestazione di Camel e il nome di 'nome' per nome di campo della tabella. Altrimenti imposta un valore nullo nella proprietà dell'intestazione di Camel.
Torna al file xml del contesto Camel e continua il percorso. Se l'intestazione di Camel è nullo; reindirizzare l'utente alla pagina fail.html; altrimenti reindirizza alla pagina che ottiene il file dall'utente (file.html).
Nota: proprietà bridgeEndpoint Si sta impostando l'endpoint http come bridgeEndpoint, il che significa che l'URL della richiesta verrà aggiornato con l'URI della richiesta.
- 1. Caricamento di più file tramite http POST
- 2. Routing condizionale Apache Camel
- 3. Apache Camel con cluster ActiveMQ
- 4. Richiesta POST HTTP Streaming HTTPClient di Apache?
- 5. Caricamento file POST tramite URLRequest
- 6. Apache Camel per chiamate asincrone
- 7. Elaborazione multithread di Apache Camel
- 8. Apache Camel: errorHandler vs onException?
- 9. Akka-HTTP: caricamento file
- 10. post http con formica per il caricamento di file
- 11. Unione di file su AWS S3 (utilizzando Apache Camel)
- 12. Caricamento file tramite Akka HTTP
- 13. Apache Camel: cosa viene effettivamente instradato?
- 14. Apache Camel: che cosa marcia i messaggi?
- 15. Limite caricamento file in HTTP
- 16. Apache Camel: come variabile di archivio per uso successivo
- 17. AngularJs Modulo POST Ajax con caricamento file
- 18. Caricamento file PHP tramite jquery post
- 19. Utilizzo di Apache Camel CMIS con Sharepoint 2013
- 20. JSP - Caricamento file con Apache Commons
- 21. Apache Bench e dati POST
- 22. Come posso invocare un servizio RESTful tramite Apache Camel?
- 23. Reindirizzare il modulo HTTP post
- 24. Ottieni avanzamento caricamento per Ruby Net :: HTTP POST
- 25. php Caricamento FILE POST senza salvataggio
- 26. Http POST in Java (con upload di file)
- 27. Caricamento di file HTTP asincroni in coda
- 28. Comprimi file prima del caricamento tramite http
- 29. Caricamento di file e altri dati da Android tramite Http POST request
- 30. Post Http con indy
Grazie, è quello che essenzialmente ho fatto. Ora funziona. –
@KaiSternad: puoi spiegare come lo hai fatto in qualche dettaglio? –
@AbhishekRanjan Mi dispiace, purtroppo non ricordo i dettagli. È passato un po 'di tempo. –