Apache Camel マルチパート HTTP ポスト (ファイル アップロード)

StackOverflow https://stackoverflow.com/questions/2415708

  •  19-09-2019
  •  | 
  •  

質問

Apache Camel HTTP コンポーネントを使用してマルチパート ファイルのアップロードを行うにはどうすればよいですか?

役に立ちましたか?

解決

私は知らない、それはHTTPのコンポーネントを使用してマルチパートフォームを送信することが可能である。

あなたは回避策が必要な場合は、

、あなたはPOJO春のApache Httpクライアントを使用しビーン(およびその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>
それはすべての静的データだから

もちろん、上記の例の体はその有用ではありません。私はテキストモード、スクリプト表現(例えば<グルーヴィー> ... )、およびのSpring BeanにXSLTの出力を使用しました - あなたは体を構築することができますいくつかの方法があります。あなたの着信メッセージ本体はすでに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 プロジェクトに取り組んでいました。

  1. ログインフォーム:ユーザーはログインしてファイルをアップロードできます。(キャメル:桟橋、HTTP、JDBC)

  2. フォームをアップロードします。サーブレットをアップロードします:ユーザーがログインできるかどうか。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

これで、プロジェクトを実行できるようになりました。その前に、このルートを Camel コンテキストに追加する必要があります。

<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 のヘッダー プロパティに null 値を設定します。

Camel コンテキスト XML ファイルに戻り、ルートを続行します。Camel のヘッダーが null の場合。ユーザーをfail.htmlページにリダイレクトします。それ以外の場合は、ユーザー (file.html) からファイルを取得するページにリダイレクトされます。

注記:BridgeEndPointプロパティHTTPエンドポイントをBridgeEndPointに設定します。これは、リクエストURLがリクエストURIで更新されることを意味します。

それはキャメルを使用する必要がありますか?

Apacheのファイルアップロードし、この非常に単純 http://commons.apache.org/fileupload/using .htmlをする

マルチパートフォームがApache Camelに到達する方法を詳しく教えてください。

Camel ルートに直接送信する Web ページ上の何らかのフォームにする必要がありますか?それとも AMQ キューでしょうか?チェックすることをお勧めします アパッチHTTP そして アパッチ桟橋 コンポーネント。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top