HTTP-сообщение Apache Camel, состоящее из нескольких частей (загрузка файла) - PullRequest
9 голосов
/ 10 марта 2010

Как я могу сделать многокомпонентную загрузку файлов, используя HTTP-компонент Apache Camel?

Ответы [ 5 ]

3 голосов
/ 18 июня 2010

Пока ваше тело сообщения имеет формат multipart / form-data, вы можете использовать компонент Camel 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. 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>

Однако вы должны быть осторожны с дополнительными пробелами. Надеюсь, это поможет!

3 голосов
/ 17 марта 2010

Я не знаю, возможно ли отправлять многокомпонентные формы, используя компонент HTTP.

Если вам нужен обходной путь, вы можете создать POJO Spring Bean, который использует Apache Http Client (и его MultipartPostMethod). Затем вы можете направить ваше сообщение этому бобу:

from("activemq:uploadQueue").to("bean:myApacheHttpClientBean?method=sendMultiPart")
1 голос
/ 05 июля 2012

Я работал над веб-проектом, используя следующие функции:

  1. Форма входа: люди могут войти и загрузить файл; (Camel: Jetty, Http, JDBC)

  2. Форма загрузки; загрузить сервлет: если люди могут войти; можете загрузить XML-файл на FTP или веб-сервер; (Верблюд: файл)

3. Файл проверен моим файлом .xsd; (Верблюд: валидатор)

  1. Файл проверен моим файлом схемы .xsl; (Верблюд: XSLT)

Я создал веб-проект моей любимой IDE (IntelliJ IDEA Jetbrains ); Я описываю часть моего сценария с исходным кодом и надеюсь, что это полезно ☺

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 или другие. Добавьте ниже конфигурацию в ваш весенний конфигурационный файл:

<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. Я хочу прочитать свой результат и получил некоторые решения, по этой причине я добавляю процессор 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.

Вернуться к XML-файлу контекста Camel и продолжить маршрут. Если заголовок Camel равен нулю; перенаправить пользователя на страницу fail.html; в противном случае перенаправьте на страницу, которая получает файл от пользователя (file.html).

Примечание: свойство bridgeEndpoint Вы устанавливаете конечной точкой http значение bridgeEndpoint, что означает, что URL-адрес запроса будет обновляться с помощью URI запроса.

0 голосов
/ 21 марта 2010

Не могли бы вы предоставить более подробную информацию, как вы хотите, чтобы составная форма достигла Apache Camel?

Должна ли быть какая-то форма на веб-странице, отправляющая прямо на верблюжий маршрут? Или очередь AMQ? Я бы посоветовал вам проверить Apache HTTP и Apache Jetty .

0 голосов
/ 10 марта 2010

Должен ли он использовать верблюда?

Apache Fileupload делает это довольно просто http://commons.apache.org/fileupload/using.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...