3-8Feign 文件上传 · SpringCloud微服务实战 · 看云

7. Feign 文件上传

导航

之前我们应该都实现过文件上传的功能,那么通过服务调用的方式实现文件上传需要注意什么呢?方式肯定是有区别

本节代码地址


7.1 新建上传项目

新建上传项目,后续的项目上传都可以走此公共上传服务
da5c51ca9d8f0fdc3fa79a9e7c8f3a6d_MD5.webp

7.2 maven 配置

此服务我们后续希望可以通过Eureka 注册中心实现服务之间的调用,因此加上spring-cloud-starter-netflix-eureka-client

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

7.3 新建启动类


@EnableDiscoveryClient
@SpringBootApplication
public class FwUploadApplication {
    public static void main(String[] args) {
        SpringApplication.run(FwUploadApplication.class, args);
    }
}

7.4 新建控制层

下面我们需要提供一个统一的上传接口,默认的上传路径是D:/fw/file/,如果你是Windows或者Mac,需要替换路径。


@RestController
@Slf4j
public class UploadController {
    @PostMapping(value = "/uploadFile")
    public String uploadFile(MultipartFile file) throws Exception {
        log.info("upload file name : {}", file.getName());
        
        file.transferTo(new File("D:/fw/file/" + file.getOriginalFilename()));
        return file.getOriginalFilename();
    }
}

7.5 添加项目配置文件

server:
  port: 8871
spring:
  application:
    name: fw-cloud-upload
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka

7.7 启动上传服务

利用Postman 测试,输入localhost:8771/uploadFile,需要注意下面几个标红框的部分,否则不能测试文件上传。
0d060052a850b8798cd6da68a3b37dcb_MD5.png

7.8 调整Feign项目配置

这里需要在Feign 中调用上传服务,跟刚才的直接调用上传服务是有区别的,需要设置一些配置文件,有哪些配置,请继续往下看。首先我们需要修改maven依赖,添加Feign 上传需要的依赖包。

需要注意的事,有些低版本的包不适合高版本的Spring Cloud ,需要调试最合适你的版本

<!-- Feign文件上传依赖-->
<dependency>
    <groupId>io.github.openfeign.form</groupId>
    <artifactId>feign-form</artifactId>
    <version>${form.version}</version>
</dependency>
<dependency>
    <groupId>io.github.openfeign.form</groupId>
    <artifactId>feign-form-spring</artifactId>
    <version>${form.version}</version>
</dependency>

7.9 设置Feign上传需要的配置


@Configuration
public class FeignMultipartSupportConfiguration {


    
    @Bean
    @Primary
    @Scope("prototype")
    public Encoder multipartEncoder(){
        return new SpringFormEncoder();
    }
}

7.10 新建Feign调用接口并引入配置文件

上一步的配置上传编码配置主要是为了在当前Feign接口中配置configuration = FeignMultipartSupportConfiguration.class,否则调用上传服务会失败。注意区分@RequestPart和RequestParam,不要将 @RequestPart(value = "file") 写成@RequestParam(value = "file")
@RequestPart与@RequestParam的区别

  • @RequestPart这个注解用在multipart/form-data表单提交请求的方法上。
  • @RequestPart支持的请求方法的方式MultipartFile,属于Spring的MultipartResolver类。这个请求是通过http协议传输的。
  • @RequestParam也同样支持multipart/form-data请求。
  • 他们最大的不同是,当请求方法的请求参数类型不再是String类型的时候。
  • @RequestParam适用于name-valueString类型的请求域, @RequestPart适用于复杂的请求域(像JSON,XML

@FeignClient(value = "fw-cloud-upload", configuration = FeignMultipartSupportConfiguration.class)
public interface FileUploadFeignService {

    
    @RequestMapping(value = "/uploadFile", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    String uploadFile(@RequestPart(value = "file") MultipartFile file);
}

7.11 在控制成添加请求方法

@PostMapping(value = "/upload")
public String upload(MultipartFile file){
    return fileUploadFeignService.uploadFile(file);
}

7.12 重启fw-cloud-feign-client项目

利用Postman 测试localhost:8771/upload
2910e7b8242564af154ed7d5d6522e45_MD5.png

我们在D:/fw/file/验证下是不是文件已上传成功
bdf73aa438d21994ef42999e865b604c_MD5.png