美文网首页
Apache Camel 、Springboot 实现文件传输

Apache Camel 、Springboot 实现文件传输

作者: howdyli | 来源:发表于2021-03-14 23:38 被阅读0次

    在实际开发过程中,我们经常需要将某台服务器的文件自动上传到另外一台服务器。这时我们就需要一个文件自动上传工具,Apache Camel就很好的实现这个功能。

    1.创建一个Spring Boot项目

    image

    选择依赖jar包:添加camel及web的依赖

    image

    确定创建项目信息


    image

    2.在POM文件中添加其他依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.4.3</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.liwei</groupId>
        <artifactId>camel-file</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>camel-file</name>
        <description>Demo project for Spring Boot</description>
        <properties>
            <java.version>1.8</java.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.camel</groupId>
                <artifactId>camel-spring-boot-starter</artifactId>
                <version>2.23.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpcore</artifactId>
                <version>4.4.9</version>
            </dependency>
            <dependency>
                <groupId>org.apache.camel</groupId>
                <artifactId>camel-http4</artifactId>
                <version>2.23.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpmime</artifactId>
                <version>4.5.5</version>
            </dependency>
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.5</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>
    

    3.application.yml配置

    file.from: file:E:/from/?recursive=true  #源文件地址,recursive参数是递归from文件夹,具体参数见http://camel.apache.org/file2
    file.to: E:/to/ #需要写入的目录
    file.upload: http4://127.0.0.1:8080/upload #上传文件的接口
    

    4.设置文件夹监听

    设置文件夹监听,当文件夹有新增文件时,会自动触发上传。from为需要上传的文件夹目录,本实例为file:E:/from/?recursive=truerecursive参数的意思是:查找子目录的文件,若为false,则只上传当前目录的文件,如有其他要求,可查询http://camel.apache.org/file2

    package com.liwei.camelfile;
    import org.apache.camel.Exchange;
    import org.apache.camel.builder.RouteBuilder;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    @Component
    public class FileUploaderRoute extends RouteBuilder {
        @Autowired
        private CamelToolProcess camelToolProcess ;
        @Override
        public void configure() {
            from("{{file.from}}")
                    .process(camelToolProcess )
                    .setHeader(Exchange.HTTP_METHOD, constant("POST"))
                    .setHeader(Exchange.CONTENT_TYPE, constant("multipart/form-data"))
                    .to("{{file.upload}}");
        }
    }
    

    5.文件处理CamelToolProcess

    //构造HTTP请求文件上传格式
    package com.liwei.camelfile;
    import org.apache.camel.Exchange;
    import org.apache.camel.Processor;
    import org.apache.http.entity.mime.HttpMultipartMode;
    import org.apache.http.entity.mime.MultipartEntityBuilder;
    import org.apache.http.entity.mime.content.FileBody;
    import org.springframework.stereotype.Component;
    import java.io.File;
    import static org.apache.http.entity.ContentType.MULTIPART_FORM_DATA;
    
    @Component
    public class CamelToolProcess implements Processor {
        @Override
        public void process(Exchange exchange) {
    
            MultipartEntityBuilder multipartEntityBuilder =
                    MultipartEntityBuilder.create();
            multipartEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
    
            String filename = (String)
                    exchange.getIn().getHeader(Exchange.FILE_NAME);
            File file = exchange.getIn().getBody(File.class);
            multipartEntityBuilder.addPart("file",
                    new FileBody(file, MULTIPART_FORM_DATA, filename));
    
            exchange.getIn().setBody(multipartEntityBuilder.build());
        }
    }
    

    6.上传文件接口

    package com.liwei.camelfile.control;
    import org.apache.commons.io.FileUtils;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.multipart.MultipartFile;
    import java.io.File;
    import java.io.IOException;
    
    @RestController
    public class FileController {
        @Value("${file.to}")
        private String to;
    
        @PostMapping("/upload")
        @ResponseBody
        public void upload(@RequestParam("file") MultipartFile file) throws IOException {
            FileUtils.writeByteArrayToFile(new File(to + file.getOriginalFilename()), file.getBytes());
        }
    }
    

    7.测试

    上传完成后会自动创建一个.camel文件,将上传成功的文件写入.camel目录中


    image-20210314225336986.png

    目标服务器的目录

    image-20210314225508278.png

    相关文章

      网友评论

          本文标题:Apache Camel 、Springboot 实现文件传输

          本文链接:https://www.haomeiwen.com/subject/alkhcltx.html