Skip to content

Commit 651953b

Browse files
committed
使用Feign传文件
1 parent 5b00dd9 commit 651953b

File tree

10 files changed

+289
-0
lines changed

10 files changed

+289
-0
lines changed
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
6+
<groupId>com.didispace</groupId>
7+
<artifactId>eureka-feign-upload-client</artifactId>
8+
<version>1.0.0</version>
9+
<packaging>jar</packaging>
10+
11+
<name>eureka-feign-upload-client</name>
12+
<description>Spring Cloud In Action</description>
13+
14+
<parent>
15+
<groupId>org.springframework.boot</groupId>
16+
<artifactId>spring-boot-starter-parent</artifactId>
17+
<version>1.5.6.RELEASE</version>
18+
<relativePath/>
19+
</parent>
20+
21+
<properties>
22+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
23+
<java.version>1.8</java.version>
24+
</properties>
25+
26+
<dependencies>
27+
<dependency>
28+
<groupId>org.springframework.boot</groupId>
29+
<artifactId>spring-boot-starter-web</artifactId>
30+
</dependency>
31+
<dependency>
32+
<groupId>org.springframework.boot</groupId>
33+
<artifactId>spring-boot-starter-test</artifactId>
34+
<scope>test</scope>
35+
</dependency>
36+
<dependency>
37+
<groupId>org.springframework.cloud</groupId>
38+
<artifactId>spring-cloud-starter-eureka</artifactId>
39+
</dependency>
40+
<dependency>
41+
<groupId>org.springframework.cloud</groupId>
42+
<artifactId>spring-cloud-starter-feign</artifactId>
43+
</dependency>
44+
45+
<dependency>
46+
<groupId>io.github.openfeign.form</groupId>
47+
<artifactId>feign-form</artifactId>
48+
<version>3.0.3</version>
49+
</dependency>
50+
<dependency>
51+
<groupId>io.github.openfeign.form</groupId>
52+
<artifactId>feign-form-spring</artifactId>
53+
<version>3.0.3</version>
54+
</dependency>
55+
<dependency>
56+
<groupId>commons-fileupload</groupId>
57+
<artifactId>commons-fileupload</artifactId>
58+
<version>1.3.3</version>
59+
</dependency>
60+
61+
<dependency>
62+
<groupId>org.projectlombok</groupId>
63+
<artifactId>lombok</artifactId>
64+
<version>1.16.20</version>
65+
<scope>provided</scope>
66+
</dependency>
67+
</dependencies>
68+
69+
<dependencyManagement>
70+
<dependencies>
71+
<dependency>
72+
<groupId>org.springframework.cloud</groupId>
73+
<artifactId>spring-cloud-dependencies</artifactId>
74+
<version>Dalston.SR2</version>
75+
<type>pom</type>
76+
<scope>import</scope>
77+
</dependency>
78+
</dependencies>
79+
</dependencyManagement>
80+
81+
<build>
82+
<plugins>
83+
<plugin>
84+
<groupId>org.springframework.boot</groupId>
85+
<artifactId>spring-boot-maven-plugin</artifactId>
86+
</plugin>
87+
</plugins>
88+
</build>
89+
90+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.didispace.api.consumer;
2+
3+
import org.springframework.boot.autoconfigure.SpringBootApplication;
4+
import org.springframework.boot.builder.SpringApplicationBuilder;
5+
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
6+
import org.springframework.cloud.netflix.feign.EnableFeignClients;
7+
8+
9+
@EnableFeignClients
10+
@EnableDiscoveryClient
11+
@SpringBootApplication
12+
public class Application {
13+
14+
public static void main(String[] args) {
15+
new SpringApplicationBuilder(Application.class).web(true).run(args);
16+
}
17+
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.didispace.api.consumer;
2+
3+
import feign.codec.Encoder;
4+
import feign.form.spring.SpringFormEncoder;
5+
import org.springframework.cloud.netflix.feign.FeignClient;
6+
import org.springframework.context.annotation.Bean;
7+
import org.springframework.context.annotation.Configuration;
8+
import org.springframework.http.MediaType;
9+
import org.springframework.web.bind.annotation.PostMapping;
10+
import org.springframework.web.bind.annotation.RequestPart;
11+
import org.springframework.web.multipart.MultipartFile;
12+
13+
@FeignClient(value = "eureka-feign-upload-server", configuration = UploadService.MultipartSupportConfig.class)
14+
public interface UploadService {
15+
16+
@PostMapping(value = "/uploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
17+
String handleFileUpload(@RequestPart(value = "file") MultipartFile file);
18+
19+
@Configuration
20+
class MultipartSupportConfig {
21+
@Bean
22+
public Encoder feignFormEncoder() {
23+
return new SpringFormEncoder();
24+
}
25+
}
26+
27+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
spring.application.name=eureka-feign-upload-client
2+
server.port=10002
3+
4+
eureka.client.serviceUrl.defaultZone=http://eureka.didispace.com/eureka/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.didispace.api.consumer;
2+
3+
import lombok.SneakyThrows;
4+
import lombok.extern.slf4j.Slf4j;
5+
import org.apache.commons.fileupload.disk.DiskFileItem;
6+
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
7+
import org.apache.commons.io.IOUtils;
8+
import org.junit.Test;
9+
import org.junit.runner.RunWith;
10+
import org.springframework.beans.factory.annotation.Autowired;
11+
import org.springframework.boot.test.context.SpringBootTest;
12+
import org.springframework.http.MediaType;
13+
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
14+
import org.springframework.web.multipart.MultipartFile;
15+
import org.springframework.web.multipart.commons.CommonsMultipartFile;
16+
17+
import java.io.File;
18+
import java.io.FileInputStream;
19+
import java.io.InputStream;
20+
import java.io.OutputStream;
21+
22+
@Slf4j
23+
@RunWith(SpringJUnit4ClassRunner.class)
24+
@SpringBootTest
25+
public class UploadTester {
26+
27+
@Autowired
28+
private UploadService uploadService;
29+
30+
@Test
31+
@SneakyThrows
32+
public void testHandleFileUpload() {
33+
34+
File file = new File("upload.txt");
35+
DiskFileItem fileItem = (DiskFileItem) new DiskFileItemFactory().createItem("file",
36+
MediaType.TEXT_PLAIN_VALUE, true, file.getName());
37+
38+
try (InputStream input = new FileInputStream(file); OutputStream os = fileItem.getOutputStream()) {
39+
IOUtils.copy(input, os);
40+
} catch (Exception e) {
41+
throw new IllegalArgumentException("Invalid file: " + e, e);
42+
}
43+
44+
MultipartFile multi = new CommonsMultipartFile(fileItem);
45+
46+
log.info(uploadService.handleFileUpload(multi));
47+
}
48+
49+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
aaa
2+
bbb
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
6+
<groupId>com.didispace</groupId>
7+
<artifactId>eureka-feign-upload-server</artifactId>
8+
<version>1.0.0</version>
9+
<packaging>jar</packaging>
10+
11+
<name>eureka-feign-upload-server</name>
12+
<description>Spring Cloud In Action</description>
13+
14+
<parent>
15+
<groupId>org.springframework.boot</groupId>
16+
<artifactId>spring-boot-starter-parent</artifactId>
17+
<version>1.5.6.RELEASE</version>
18+
<relativePath/>
19+
</parent>
20+
21+
<properties>
22+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
23+
<java.version>1.8</java.version>
24+
</properties>
25+
26+
<dependencies>
27+
<dependency>
28+
<groupId>org.springframework.boot</groupId>
29+
<artifactId>spring-boot-starter-web</artifactId>
30+
</dependency>
31+
<dependency>
32+
<groupId>org.springframework.cloud</groupId>
33+
<artifactId>spring-cloud-starter-eureka</artifactId>
34+
</dependency>
35+
<dependency>
36+
<groupId>org.springframework.cloud</groupId>
37+
<artifactId>spring-cloud-starter-feign</artifactId>
38+
</dependency>
39+
</dependencies>
40+
41+
<dependencyManagement>
42+
<dependencies>
43+
<dependency>
44+
<groupId>org.springframework.cloud</groupId>
45+
<artifactId>spring-cloud-dependencies</artifactId>
46+
<version>Dalston.SR2</version>
47+
<type>pom</type>
48+
<scope>import</scope>
49+
</dependency>
50+
</dependencies>
51+
</dependencyManagement>
52+
53+
<build>
54+
<plugins>
55+
<plugin>
56+
<groupId>org.springframework.boot</groupId>
57+
<artifactId>spring-boot-maven-plugin</artifactId>
58+
</plugin>
59+
</plugins>
60+
</build>
61+
62+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.didispace.api.consumer;
2+
3+
import org.springframework.boot.autoconfigure.SpringBootApplication;
4+
import org.springframework.boot.builder.SpringApplicationBuilder;
5+
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
6+
import org.springframework.cloud.netflix.feign.EnableFeignClients;
7+
import org.springframework.http.MediaType;
8+
import org.springframework.web.bind.annotation.PostMapping;
9+
import org.springframework.web.bind.annotation.RequestPart;
10+
import org.springframework.web.bind.annotation.RestController;
11+
import org.springframework.web.multipart.MultipartFile;
12+
13+
@EnableFeignClients
14+
@EnableDiscoveryClient
15+
@SpringBootApplication
16+
public class Application {
17+
18+
@RestController
19+
public class UploadController {
20+
21+
@PostMapping(value = "/uploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
22+
public String handleFileUpload(@RequestPart(value = "file") MultipartFile file) {
23+
return file.getName();
24+
}
25+
26+
}
27+
28+
public static void main(String[] args) {
29+
new SpringApplicationBuilder(Application.class).web(true).run(args);
30+
}
31+
32+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
spring.application.name=eureka-feign-upload-server
2+
server.port=10001
3+
4+
eureka.client.serviceUrl.defaultZone=http://eureka.didispace.com/eureka/

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
- [Spring Cloud构建微服务架构:服务消费者(基础)](http://blog.didispace.com/spring-cloud-starter-dalston-2-1/)
2929
- [Spring Cloud构建微服务架构:服务消费者(Ribbon)](http://blog.didispace.com/spring-cloud-starter-dalston-2-2/)
3030
- [Spring Cloud构建微服务架构:服务消费者(Feign)](http://blog.didispace.com/spring-cloud-starter-dalston-2-3/)
31+
- [Spring Cloud构建微服务架构:服务消费者(Feign)传文件](http://blog.didispace.com/spring-cloud-starter-dalston-2-4/)
3132
- [Spring Cloud构建微服务架构:分布式配置中心](http://blog.didispace.com/spring-cloud-starter-dalston-3)
3233
- [Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)](http://blog.didispace.com/spring-cloud-starter-dalston-4-1)
3334
- [Spring Cloud构建微服务架构:服务容错保护(Hystrix依赖隔离)](http://blog.didispace.com/spring-cloud-starter-dalston-4-2)

0 commit comments

Comments
 (0)