项目背景: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;
}