如何使用 Apache Camel HTTP 组件进行分段文件上传?

有帮助吗?

解决方案

我不知道是否有可能使用HTTP组件可以发送多形式。

如果您需要的解决方法,您可以创建一个使用Apache的HTTP客户端POJO的Spring bean(及其MultipartPostMethod)。然后你可以路由邮件到该bean:

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

其他提示

只要你的消息主体中的multipart / form-data的格式,则可以使用HTTP骆驼部件将它发送到另一个服务器。关键是要正确设置了内容类型和设置请求方法是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>

显然,例如本体上方不是有用的,因为它是所有静态数据。有许多的方法可以构建体 - 我使用XSLT输出在文本模式下,脚本表达式(例如<常规> ... ),以及一个Spring bean。 XSLT效果很好,当你收到邮件正文已经是一个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>

您确实需要小心多余的空格,但是。希望这有助于!

我正在开发一个具有以下功能的网络项目:

  1. 登录表单:人们登录并可以上传文件;(骆驼:码头、HTTP、JDBC)

  2. 上传表格;上传servlet:人们是否可以登录;可以上传xml文件到ftp或web服务器;(骆驼:文件)

3.文件由我的.xsd文件验证;(骆驼:验证器)

  1. 文件由我的 .xsl 架构文件检查;(骆驼:XSLT)

我是用我最喜欢的 IDE(IntelliJ IDEA by 捷脑公司);我用源代码描述了我的部分场景,希望这有用 ☺

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)模式.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)测试数据.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)配置spring-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) 骆驼上下文.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中设置了选择查询,因此选择结果也存储在Camel的Body中。我想阅读我的结果并做出一些决定,因此我添加了 Camel 处理器,如下所示:

6) 登录处理器.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 属性中设置 null 值。

返回 Camel 上下文 xml 文件并继续该路线。如果 Camel 的 header 为 null;将用户重定向到fail.html页面;否则重定向到从用户获取文件的页面(file.html)。

笔记:bridgeEndpoint 属性 将 http 终结点设置为 bridgeEndpoint,这意味着请求 URL 将使用请求 URI 进行更新。

它是否必须使用骆驼?

Apache的文件上传执行此相当简单地 http://commons.apache.org/fileupload/using html的

能否请您提供更多的细节你想怎么多形式达到Apache的骆驼?

它应该是某种形式的对可以直接发送到骆驼路线的网页?或AMQ队列? 我建议你检查的Apache HTTP 和的阿帕奇码头组件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top