在实际开发过程中,我们经常需要将某台服务器的文件自动上传到另外一台服务器。这时我们就需要一个文件自动上传工具,Apache Camel就很好的实现这个功能。
1.创建一个Spring Boot项目
进入https://start.spring.io/
,创建Spring Boot
项目,添加camel
及web
的依赖。本实例使用的是http
上传文件,也可以使用其他上传文件形式,如:FTP
等。
2.在POM文件中添加其他依赖
在pom文件中添加commons-io
等依赖,具体pom.xml
文件如下
<?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 http://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.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.pengchao</groupId>
<artifactId>camel-tools</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>camel-tools</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=true
,recursive
参数的意思是:查找子目录的文件,若为false
,则只上传当前目录的文件,如有其他要求,可查询http://camel.apache.org/file2
package com.pengchao.cameltools.listener;
import com.pengchao.cameltools.process.CamelToolProcess;
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.pengchao.cameltools.process;
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.pengchao.cameltools.controller;
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.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")
public void upload(MultipartFile file) throws IOException {
FileUtils.writeByteArrayToFile(new File(to + file.getOriginalFilename()), file.getBytes());
}
}
7.测试
上传完成后会自动创建一个.camel文件,将上传成功的文件写入.camel目录中
服务器的目录