如何使用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. 来自java的多部分文件上传发布请求
- 2. 创建包括多部分文件上传的发布请求
- 3. 多个HTTP文件上传
- 4. 使用Camel的ActiveMQ的HTTP发布
- 5. 使用Apache REST客户端的多部分文件上传
- 6. 如何使用apache-camel restlet组件处理文件上传?
- 7. Apache Camel多行文件解析失败
- 8. Apache Camel服务器应用程序接收多部分表单POST(文件上传)
- 9. 多部分后上传文件
- 10. 春季多部分文件上传
- 11. 多部分文件上传方法
- 12. 多部分上传文件servlet
- 13. Ruby中的多部分文件上传
- 14. Spring mvc多部分文件上传
- 15. Apache Camel SFTP文件上传不起作用
- 16. Apache Camel - 从netty到文件
- 17. Apache Camel FTP文件列表?
- 18. Apache Camel文件格式
- 19. Ruby on Rails - OAuth 2多部分发布(上传至Facebook或Soundcloud)
- 20. 在一个HTTP文件中上传多个文件上传
- 21. 部署Apache Camel项目
- 22. 如何使用http发布上传的文件?
- 23. Apache + PHP截断发布/上传
- 24. Apache Camel FTP组件
- 25. 弹出多个多部分请求文件上传 - 多部分大小为0
- 26. 移动分块文件HTTP上传
- 27. 如何使用camel http compponent将文件上传到在apache tomcat服务器上运行的应用程序?
- 28. 跨浏览器通过HTTP(部分)上传大文件?
- 29. 多线程http文件上传
- 30. 上传多个HTTP PUT文件PHP
谢谢,这就是我基本上做的。它现在有效。 – 2010-03-22 16:14:50
@KaiSternad:你能解释一下你是如何做到的? – 2016-04-06 11:00:05
@AbhishekRanjan很抱歉,不幸的是我不记得细节。有一阵子了。 – 2016-04-06 11:07:42