通过Feign服务实现文件上传

项目背景:spring cloud 微服务架构

一、单文件上传

1、文件服务

@PostMapping("/upload_file")
public void upload(@RequestParam(“file”) MultipartFile file){
}

2、外部调用统一入口服务

RestController层:

@PostMapping("/api/upload_file")
public void upload(@RequestParam(“file”) MultipartFile file){
//调用feign接口
}

FeignClient层:

@FeignClient(name = “XXX”, configuration = XXX.class, fallback =XXX.class)
public interface FileClientService {
/**
*注意:
*传递文件的注解不能再使用@RequestParam
*而必须使用@RequestPart
*/
@RequestMapping(method = RequestMethod.POST, value = “/upload_file”,produces = {MediaType.APPLICATION_JSON_UTF8_VALUE},consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public RespMsgBean uploadFile(@RequestPart(“file”) MultipartFile file);

/**
*配置内部类
*/
@Configuration
class MultipartSupportConfig {
    @Autowired
    private ObjectFactory messageConverters;
    @Bean
    public Encoder feignFormEncoder() {
        return new SpringFormEncoder(new SpringEncoder(messageConverters));
    }
}

}

二、多文件上传(非数组形式)

1、文件服务

@PostMapping("/upload_files")
public void uploads(@RequestParam(“file1”) MultipartFile file1,@RequestParam(“file2”) MultipartFile file2){
}

2、外部调用统一入口服务

	/**
	*注意:这种写法是错误的,feign接口不支持写多个MultipartFile参数
	*/
	@RequestMapping(method = RequestMethod.POST, value = "/upload_files",produces = {MediaType.APPLICATION_JSON_UTF8_VALUE},consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
	public void uploadFiles(@RequestPart("file1") MultipartFile file1,@RequestPart("file2") MultipartFile file2);

既然不能通过feign接口传多个文件,只能通过模拟form表单上传文件,来跳过feign接口,直接访问文件服务器

RestController层:
	@PostMapping("/api/upload_files")
    public void uploads(@RequestParam("file1") MultipartFile file1,@RequestParam("file2") MultipartFile file2){
    	String url = "文件服务器地址";
    	try {
            Map params = HttpContextUtil.getParamsMap();
            InputStreamBody fileBody = new InputStreamBody(file1.getInputStream(),file1.getOriginalFilename());
            InputStreamBody thumbBody = new InputStreamBody(file2.getInputStream(),file2.getOriginalFilename());
            HttpEntity reqEntity = MultipartEntityBuilder.create()
                    .addPart("file",fileBody)
                    .addPart("thumb",thumbBody)
                    .build();
            String result = HttpUtils.doFormFile(url,reqEntity);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

写一个工具类HttpUtils执行发送
public static String doFormFile(String url, HttpEntity entity) throws IOException {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(entity);
CloseableHttpResponse response = httpClient.execute(httpPost);
HttpEntity resEntity = response.getEntity();
String resultString = EntityUtils.toString(resEntity, “utf-8”);
return resultString;
}

你可能感兴趣的:(进阶,Feign,上传文件)