spring Cloud 使用feign进行文件MultipartFile的传递
出现错误的原因:
报错:
在服务提供者报错:Current request is not a multipart request
然后查找相关资料
SpringCloud 组件fiegn
默认是不支持传递文件的但提供了 feign-form 拓展工具
解决方法:
步骤一:在消费者服务中加入相关依赖pom中
<!--解决SpringCloud 组件fiegn默认是不支持传递文件的-->
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form-spring</artifactId>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>io.github.openfeign.form</groupId>
<artifactId>feign-form</artifactId>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
步骤二:编写一个配置类
package com.yep.config;
import feign.codec.Encoder;
import feign.form.spring.SpringFormEncoder;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.support.SpringEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.Scope;
/**
* 解决feign文件传递问题的配置类
*/
@Configuration
public class FeignMultipartSupportConfig {
@Autowired
private ObjectFactory<HttpMessageConverters> messageConverters;
@Bean
@Primary
@Scope("prototype")
public Encoder multipartFormEncoder() {
return new SpringFormEncoder(new SpringEncoder(messageConverters));
}
@Bean
public feign.Logger.Level multipartLoggerLevel() {
return feign.Logger.Level.FULL;
}
}
步骤三:feign接口的编写
- 服务调用方加注解类(配置类)
@RequestPart
来接收文件参数
package com.yep.feign;
import com.yep.config.FeignMultipartSupportConfig;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
/**
* OSS存储模块,远程服务发现提供接口
*/
@FeignClient(value = "service-oss", // 对应的项目名
configuration= FeignMultipartSupportConfig.class // 解决feign文件传递问题的配置类feign配置类)
)
public interface ossFileFeign {
/**
* 文件上传到七牛云
*/
@PostMapping(value = "/oss/file/upload" ,consumes = "multipart/form-data") // "multipart/form-data"指定类型
public String uploadImg(@RequestPart("file") MultipartFile img) throws IOException ;
}
步骤四:修改被调用的服务接收文件流
@RequestPart
来接收文件参数
package com.yep.controller;
import com.yep.service.UploadService;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
/**
* 七牛云oss
*/
@RestController
@RequestMapping("/oss/file")
public class FileApiController {
@Autowired
private UploadService uploadService;
/**
* 文件上传 到七牛云
* @param img 要上传文件对象
* @return
* @throws IOException
*/
@PostMapping("/upload")
public String uploadImg(@RequestPart("file") MultipartFile img) throws IOException {
System.out.println("我被调用了");
String url = uploadService.uploadImg(img);
return url;
}
}
注意点:
注意:文件流要用
RequestPart
注解传参,其余参数用RequestParam
注解传参