遇到一个需要接收上传文件,并且转发到其他服务的一个需求。
接收文件比较简单,但是对于转发有点迷惑。后多次调试后成功:
public Object request(HttpServletRequest servletRequest){
String address = "http://localhost:8500";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
MultiValueMap<String, Object> paramMap = fillMap(servletRequest);
HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(paramMap, headers);
String result = new RestTemplate().postForEntity(address, request, String.class).getBody();
JSONObject object = JSONObject.parseObject(result);
System.out.println(object);
return object;
}
private static MultiValueMap<String, Object> fillMap(HttpServletRequest request) {
MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<>();
String type = request.getParameter("type");
if (StringUtils.isBlank(type)) {
throw new RuntimeException("type 为空");
}
switch (type){
case "url":
String url = request.getParameter("url");
if (StringUtils.isBlank(url)) {
throw new RuntimeException("url 为空");
}
paramMap.add("type", "url");
paramMap.add("url", url);
break;
case "data":
String data = request.getParameter("data");
if (StringUtils.isBlank(data)) {
throw new RuntimeException("data 为空");
}
paramMap.add("type", "data");
paramMap.add("data", data);
break;
case "b64":
String base64 = request.getParameter("b64");
if (StringUtils.isBlank(base64)) {
throw new RuntimeException("b64 为空");
}
paramMap.add("type", "b64");
paramMap.add("b64", base64);
break;
case "file":
paramMap.add("type", "file");
MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
MultipartFile file = (multipartHttpServletRequest).getMultiFileMap().get("file").get(0);
paramMap.add("file", file.getResource());
break;
}
return paramMap;
}
用 HttpServletRequest 接收参数,并转为 MultipartHttpServletRequest 类型,如上代码,通过getMultiFileMap.get("file"),这里的key是传参时候的名称,表单形式提交:
这里确认只有一个file,所以取第一个,作为参数传递的时候,只需传递file.getResource即可。
请求结果成功。