如何使用Apache Camel HTTP組件進行多部分文件上傳?Apache Camel多部分HTTP發佈(文件上傳)
回答
我不知道是否有可能發送使用HTTP組件多形式。
如果您需要解決方法,您可以創建使用Apache Http Client(及其MultipartPostMethod
)的POJO Spring Bean。然後你就可以路由郵件到該bean:
from("activemq:uploadQueue").to("bean:myApacheHttpClientBean?method=sendMultiPart")
是否必須使用駱駝?
的Apache的FileUpload做到這一點很簡單http://commons.apache.org/fileupload/using.html
是的,它必須是駱駝。另外,Apache Fileupload是一個服務器端組件。我需要將文件從駱駝上傳到已知道如何處理多部分上傳的服務器。我已經採取封裝上傳部分在一個單獨的bean。如果能夠開箱即可使用它本來不錯。 – 2010-03-10 14:57:12
你能否提供更多的細節,你如何想多形式達到Apache的駱駝?
它應該是直接發送到駱駝路線的網頁上的某種形式嗎?或者AMQ隊列? 我建議你檢查Apache HTTP和Apache Jetty組件。
只要您的郵件正文處於多部分/表格數據格式,您可以使用Camel http組件將其張貼到另一臺服務器。關鍵是要正確設置你的Content-Type和設置請求方法是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>
很明顯,因爲它是所有靜態數據的例子身體上面是沒有多大用處的。有許多方法可以構建主體 - 我在文本模式下使用了XSLT輸出,一個腳本表達式(例如< groovy> ... </groovy>)和一個Spring bean。當您的傳入郵件正文已經是一個XML文檔時,XSLT很有效:
<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>
但是,您確實需要小心額外的空格。希望這可以幫助!
我已經通過以下Web項目的工作特點:
登錄表單:人登錄,並可以上傳文件; (Camel:Jetty,Http,JDBC)
上傳表格;上傳servlet:如果有人可以登錄;可以將xml文件上傳到ftp或web服務器; (駱駝文件)
3.文件通過我的.xsd文件驗證; (Camel:Validator)
- 文件被我的.xsl模式文件檢查; (Camel:XSLT)
我是通過我最喜歡的IDE(IntelliJ IDEA Jetbrains)創建web項目; 我用源代碼描述我的場景的一部分,並希望這是有用的☺
1)索引。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>
首先,你必須創建數據庫和登錄表;然後添加一些樣本數據; 例如添加這些文件:
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)測試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)配置彈簧的context.xml
然後,你可以使用像derby,H2,mysql或其他嵌入式數據庫。下面添加配置到你的Spring配置文件:
<jdbc:embedded-database id="dataSource" type="H2">
<jdbc:script location="classpath:schema.sql"/>
<jdbc:script location="classpath:test-data.sql"/>
</jdbc:embedded-database>
5)駱駝的context.xml
現在,你可以運行你的項目;在此之前,您必須將此路線添加到您的駱駝環境中:
<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>
當您運行我們的項目時;顯示index.html頁面,您可以放置用戶名和密碼文本框併發送表單。
其實駱駝是聽這個碼頭的港口,並得到您的發佈信息。 您可以通過Camel的標題(如'$ {in.header.user}')獲取這些信息。你可以看到,我在Camel的Body中設置了我的select查詢,因此select的結果也存儲在Camel的Body中。 我想讀我的結果,並得到了一些決定,我爲此添加駱駝處理器如下:
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);
}
}
}
在LoginProcessor我檢查身體,如果輸入的用戶名和密碼有效;添加Camel的頭部屬性,並按'name'命名爲表格的字段名稱。否則,在Camel的header屬性中設置空值。
返回駱駝上下文xml文件並繼續路由。 如果駱駝的標頭爲空;將用戶重定向到fail.html頁面;否則重定向到從用戶(file.html)獲取文件的頁面。
注意:bridgeEndpoint屬性 您正在將http端點設置爲bridgeEndpoint,這意味着請求URL將使用請求URI進行更新。
- 1. Camel的多部分表單數據文件上傳
- 2. 創建包括多部分文件上傳的發佈請求
- 3. 來自java的多部分文件上傳發布請求
- 4. HTTP文件上傳,發佈到webservice
- 5. Apache Http客戶端4表單發佈多部分數據
- 6. Apache Camel Sticky Http Routing
- 7. 多個HTTP文件上傳
- 8. 使用Camel的ActiveMQ的HTTP發佈
- 9. 使用Apache REST客戶端的多部分文件上傳
- 10. 4GB HTTP文件上傳使用jQuery文件上傳,Apache和PHP
- 11. 如何使用apache-camel restlet組件處理文件上傳?
- 12. Apache Camel多行文件解析失敗
- 13. 多部分後上傳文件
- 14. Apache Camel服務器應用程序接收多部分表單POST(文件上傳)
- 15. Apache Camel:發佈CXF Web服務
- 16. Apache Camel動態Http調用
- 17. Spring mvc多部分文件上傳
- 18. 多部分上傳文件servlet
- 19. 多部分實體文件上傳java.lang.ArrayIndexOutOfBoundsException
- 20. Ionic中的多部分文件上傳
- 21. Ruby中的多部分文件上傳
- 22. 多部分文件上傳方法
- 23. 春季多部分文件上傳
- 24. JSP多部分文件上傳
- 25. 在Apache Camel上傳到ftp後刪除文件
- 26. Apache Camel SFTP文件上傳不起作用
- 27. jQuery發佈上傳文件
- 28. 發佈上傳文件名
- 29. Apache Camel - 從netty到文件
- 30. apache camel split csv文件
謝謝,這就是我基本上做的。它現在有效。 – 2010-03-22 16:14:50
@KaiSternad:你能解釋一下你是如何做到的? – 2016-04-06 11:00:05
@AbhishekRanjan很抱歉,不幸的是我不記得細節。有一陣子了。 – 2016-04-06 11:07:42