문제

Apache Camel HTTP 구성 요소를 사용하여 Multipart 파일 업로드를 수행하려면 어떻게해야합니까?

도움이 되었습니까?

해결책

HTTP 구성 요소를 사용하여 멀티 파트 양식을 보낼 수 있는지 모르겠습니다.

해결 방법이 필요한 경우 Apache HTTP 클라이언트를 사용하는 Pojo Spring Bean을 만들 수 있습니다. MultipartPostMethod). 그런 다음 메시지를 해당 콩으로 라우팅 할 수 있습니다.

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

다른 팁

메시지 본문이 멀티 파트/양식 데이터 형식 인 한 Camel HTTP 구성 요소를 사용하여 다른 서버에 게시 할 수 있습니다. 트릭은 컨텐츠 유형을 올바르게 설정하고 요청 메소드를 게시하도록 설정하는 것입니다.

<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 출력, 스크립트 표현식을 사용했습니다 (예 :u003Cgroovy> ...u003C/groovy> ), 그리고 스프링 콩. 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>

그러나 여분의 공백에주의해야합니다. 도움이 되었기를 바랍니다!

아래 기능으로 웹 프로젝트 작업을 수행했습니다.

  1. 로그인 양식 : 사람들이 로그인하고 파일을 업로드 할 수 있습니다. (낙타 : Jetty, HTTP, JDBC)

  2. 양식 업로드; 서블릿 업로드 : 사람들이 로그인 할 수있는 경우; XML 파일을 FTP 또는 웹 서버에 업로드 할 수 있습니다. (낙타 : 파일)

3. 파일은 내 .xsd 파일로 검증됩니다. (낙타 : 유효성 검사기)

  1. 내 .xsl schema 파일에서 파일을 확인합니다. (낙타 : XSLT)

나는 내가 가장 좋아하는 IDE (Intellij Idea by 제트 브레인); 소스 코드로 시나리오의 일부를 설명하고 이것이 유용하기를 바랍니다.

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) 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 페이지가 표시되었으며 사용자 이름과 비밀번호 텍스트 상자를 넣고 양식을 보낼 수 있습니다.

실제로 낙타는이 부두 항구를 듣고 게시물 정보를 얻었습니다. '$ {in.header.user}'와 같은 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의 헤더 속성에서 NULL 값을 설정하십시오.

Camel Context XML 파일로 돌아가서 경로를 계속하십시오. 낙타의 헤더가 널 인 경우; 실패로 리디렉션. html 페이지; 그렇지 않으면 사용자 (file.html)에서 파일을 가져 오는 페이지로 리디렉션됩니다.

참고 : BridgeEndpoint 속성 HTTP 엔드 포인트를 BridgeendPoint로 설정하는 속성 요청 URI로 요청 URL이 업데이트됩니다.

낙타를 사용해야합니까?

Apache FileUpload는 이것을 아주 간단하게 수행합니다 http://commons.apache.org/fileupload/using.html

자세한 내용을 제공해 주시겠습니까? 멀티 파트 양식에 도달 아파치 낙타를 원하는 방법은 무엇입니까?

낙타 루트로 직접 보내는 웹 페이지에서 어떤 형태가 있어야합니까? 아니면 AMQ 대기열? 확인하는 것이 좋습니다 아파치 http 그리고 아파치 부두 구성 요소.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top