Apache Camel多部分HTTP帖子(文件上传)

时间:2010-03-10 09:24:08

标签: java apache-camel

如何使用Apache Camel HTTP组件上传多部分文件?

5 个答案:

答案 0 :(得分:3)

我不知道是否可以使用HTTP组件发送多部分表单。

如果需要解决方法,可以创建使用Apache Http Client(及其MultipartPostMethod)的POJO Spring Bean。然后,您可以将消息路由到该bean:

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

答案 1 :(得分:3)

只要您的邮件正文是multipart / form-data格式,就可以使用Camel http组件将其POST到另一台服务器。诀窍是正确设置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"

    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输出,脚本表达式(例如&lt; groovy&gt; ...&lt; / groovy&gt;)和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>

但是,您确实需要注意额外的空格。希望这有帮助!

答案 2 :(得分:1)

我通过以下功能开展了一个网络项目:

  1. 登录表格:人们登录并可以上传文件; (Camel:Jetty,Http,JDBC)

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

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

    1. 我的.xsl架构文件检查文件; (骆驼:XSLT)
    2. 我是由我最喜欢的IDE(Intelli {IDEA by Jetbrains)创建的web项目; 我用源代码描述了我的场景的一部分,希望这很有用☺

      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>
      

      首先你必须创建数据库和登录表;然后添加一些样本数据; 例如,添加这些文件:

      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 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)camel-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正在听这个码头端口并获得你的帖子信息。 您可以通过Camel的标题获取这些信息,例如'$ {in.header.user}'。

      如您所见,我在Camel的Body中设置了我的选择查询,因此选择结果也存储在Camel的Body中。 我想阅读我的结果并做出一些决定,因此我添加了Camel处理器,如下所示:

      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的头属性中设置空值。

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

      注意:bridgeEndpoint属性 您正在将http端点设置为bridgeEndpoint,这意味着将使用请求URI更新请求URL。

答案 3 :(得分:0)

是否必须使用Camel?

Apache Fileupload非常简单http://commons.apache.org/fileupload/using.html

答案 4 :(得分:0)

您能否提供更多详细信息,您希望多部分表格如何达到apache camel?

是否应该是直接发送到Camel路由的网页上的某种形式?还是AMQ队列? 我建议您检查Apache HTTPApache Jetty组件。