通过Feign服务实现文件上传

本文介绍了在Spring Cloud微服务架构中如何通过Feign服务实现单文件和多文件上传。在单文件上传中,展示了文件服务端接口及外部调用统一入口服务的实现。而在多文件上传部分,由于Feign不支持直接传多个文件,所以通过模拟form表单直接访问文件服务器来完成上传。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目背景: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<HttpMessageConverters> 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<String,Object> 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值