Pergunta

Como posso fazer uploads de arquivo multipart usando o componente HTTP do Apache Camel?

Foi útil?

Solução

Não sei se é possível enviar formulários multipart usando o componente HTTP.

Se você precisar da solução alternativa, pode criar o Pojo Spring Bean que usa o cliente HTTP Apache (e seu MultipartPostMethod). Então você pode rotear sua mensagem para aquele feijão:

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

Outras dicas

Enquanto o corpo da sua mensagem estiver no formato multipart/formato de dados, você pode usar o componente HTTP de camelo para publicá-lo em outro servidor. O truque é definir seu tipo de conteúdo corretamente e definir o método de solicitação a ser postado:

<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>

Obviamente, o corpo de exemplo acima não é tão útil porque são todos dados estáticos. Existem várias maneiras de construir o corpo - usei a saída XSLT no modo de texto, uma expressão script (por exemplou003Cgroovy> ...u003C/groovy> ) e um feijão de primavera. O XSLT funciona bem quando seu corpo de mensagem de entrada já é um documento 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>

Você precisa ter cuidado com o espaço em branco extra, no entanto. Espero que isto ajude!

Eu estava trabalhando em um projeto da web abaixo dos recursos:

  1. Formulário de login: as pessoas login e podem fazer upload do arquivo; (Camel: Jetty, HTTP, JDBC)

  2. Formulário de upload; Carregar servlet: se as pessoas puderem fazer login; pode fazer upload do arquivo XML para FTP ou servidor da Web; (Camel: arquivo)

3.File é validado pelo meu arquivo .xsd; (Camel: Validator)

  1. O arquivo é verificado pelo meu arquivo de esquema .xsl; (Camel: XSLT)

Eu fui criar um projeto da web pelo meu ide (Intellij Idea por Jetbrains); Eu descrevo parte do meu cenário com código -fonte e espero que seja útil ☺

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>

Primeiro, você deve criar o banco de dados e a tabela de login; Em seguida, adicione alguns dados de amostra; Por exemplo, adicione estes arquivos:

2) esquema.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

Em seguida, você pode usar bancos de dados incorporados como Derby, H2, MySQL ou outros. Adicione a configuração abaixo ao seu arquivo de configuração de primavera:

<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

Agora, você pode executar seu projeto; Antes de fazer isso, você deve adicionar esta rota ao seu contexto de camelo:

<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>

Quando você administra nosso projeto; A página Index.html foi mostrada e você pode colocar as caixas de texto de nome de usuário e senha e enviar seu formulário.

Na verdade, Camel estava ouvindo esta porta do jetty e obteve suas informações de postagem. Você pode obter essas informações pelo cabeçalho de Camel como '$ {in.header.user}'.

Como você pode ver, defino minha consulta selecionada no corpo de Camel, portanto, o resultado selecionado também é armazenado no corpo de Camel. Quero ler meu resultado e tome algumas decisões, por esse motivo, adiciono o processador de camelo como abaixo:

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);
    }
}

}

No LoginProcessor, verifiquei o corpo e se o nome de usuário e a senha de entrada forem válidos; Adicione a propriedade do cabeçalho do Camel e nomeado por 'Nome' pelo nome do campo da tabela. Caso contrário, defina o valor nulo na propriedade de cabeçalho do camel.

Voltar ao arquivo XML de contexto de camel e continuar a rota. Se o cabeçalho de Camel for nulo; Redirecionar o usuário para falhar.html página; Caso contrário, redirecione para a página que obtenha arquivo do usuário (file.html).

Nota: Propriedade do BridgeEndPoint Você está definindo o endpoint HTTP como BridgeEndPoint, o que significa que a URL da solicitação será atualizada com o Request URI.

Tem que estar usando o camelo?

Apache FileUpload faz isso simplesmente http://commons.apache.org/fileupload/using.html

Você poderia fornecer mais detalhes, como deseja que o formulário de multipart Apache Camel?

Deveria ser algum formulário em uma página da Web que envie diretamente para a rota de camelo? Ou fila AMQ? Eu sugiro que você checasse Apache http e Apache Jetty componentes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top