Apache Camel HTTP コンポーネントを使用してマルチパート ファイルのアップロードを行うにはどうすればよいですか?
4 に答える
メッセージ本文が 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 出力、スクリプト式 (例: <groovy>...</groovy>)、および 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>
ただし、余分な空白には注意する必要があります。お役に立てれば!
HTTP コンポーネントを使用してマルチパート フォームを送信できるかどうかはわかりません。
回避策が必要な場合は、Apache Http クライアント (およびそのMultipartPostMethod
) を使用する POJO Spring Bean を作成できます。次に、メッセージをその Bean にルーティングできます。
from("activemq:uploadQueue").to("bean:myApacheHttpClientBean?method=sendMultiPart")
私は以下の機能でWebプロジェクトに取り組んでいました:
ログインフォーム: ユーザーはログインしてファイルをアップロードできます。(キャメル: Jetty、Http、JDBC)
アップロードフォーム; サーブレットのアップロード: ユーザーがログインできる場合。xml ファイルを ftp または Web サーバーにアップロードできます。(キャメル:ヤスリ)
3.ファイルは .xsd ファイルによって検証されます。(キャメル: バリデーター)
- ファイルは .xsl スキーマ ファイルによってチェックされます。(キャメル: XSLT)
私はお気に入りの IDE ( Jetbrainsによる IntelliJ IDEA ) で Web プロジェクトを作成していました。シナリオの一部をソース コードで説明しますが、これがお役に立てば幸いです ☺</p>
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) スキーマ.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 などの組み込みデータベースを使用できます。以下の構成を春の構成ファイルに追加します。
<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はこの桟橋のポートを聞いていて、あなたの投稿情報を取得していました。これらの情報は、'${in.header.user}' のような Camel のヘッダーで取得できます。
ご覧のとおり、選択クエリを 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 のヘッダー プロパティを追加し、テーブルのフィールド名によって「名前」で名前を付けます。それ以外の場合は、Camel のヘッダー プロパティに null 値を設定します。
Camel コンテキスト xml ファイルに戻り、ルートを続行します。Camel のヘッダーが null の場合。ユーザーを fail.html ページにリダイレクトします。それ以外の場合は、ユーザーからファイルを取得するページ (file.html) にリダイレクトします。
注: bridgeEndpoint プロパティ http エンドポイントを bridgeEndpoint に設定しています。これは、リクエスト URL がリクエスト URI で更新されることを意味します。
マルチパートフォームが apache camel に到達する方法の詳細を教えてください。
Camelルートに直接送信するWebページ上の何らかのフォームである必要がありますか? またはAMQキュー?Apache HTTPおよびApache Jettyコンポーネントを確認することをお勧めします。