在项目中遇到一个需求:客户端请求中间转发服务器,然后由中间转发服务器,转发请求到具体项目中处理
在客户端上传文件的时候,具体项目接收不到请求,后来查了下具体原因,是中间件服务器没有把图片数据传送到具体项目中
解决办法,在中间件服务器中解析请求,再使用restTemplate转发请求
具体项目解析文件和数据的代码
@RequestMapping(value = "doConfirmProduction", method = { RequestMethod.POST, RequestMethod.GET })
@ResponseBody
public ReturnMsgBean doConfirmProduction(HttpServletRequest request){
ReturnMsgBean rmb = new ReturnMsgBean();
try {
String data = request.getParameter("data");
MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
List<MultipartFile> confirmPictureList = multipartHttpServletRequest.getFiles("confirmPictureFiles");
List<MultipartFile> defectPictureList = multipartHttpServletRequest.getFiles("defectPictureFiles");
//处理逻辑略……
} catch (Exception e) {
LOGGER.error("报工失败",e);
rmb.setReturnCode(ReturnMsgBean.CODE_PA);
rmb.setStatus(ReturnMsgBean.ERROR);
rmb.setReturnMsg(ReturnMsgBean.EXCEPTION);
}
return rmb;
}
中间服务器转发请求
@RequestMapping(value = "doConfirmProduction", method = { RequestMethod.POST, RequestMethod.GET })
public ReturnMsgBean doConfirmProduction(HttpServletRequest request){
ReturnMsgBean rmb = new ReturnMsgBean();
//创建临时文件夹,存放客户端发送过来的文件
String parentPath = "d:/usr/temp/file/";
File parentFile = new File(parentPath);
try {
if (!parentFile.exists()) {
parentFile.mkdirs();
}
MultiValueMap<String,Object> postParameters=new LinkedMultiValueMap<String,Object>();
String data = request.getParameter("data");
postParameters.add("data",data);
if(request instanceof MultipartHttpServletRequest){
MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
List<MultipartFile> confirmPictureList = multipartHttpServletRequest.getFiles("confirmPictureFiles");
List<MultipartFile> defectPictureList = multipartHttpServletRequest.getFiles("defectPictureFiles");
addToMultiValueMap(postParameters,confirmPictureList,"confirmPictureFiles",parentPath);
addToMultiValueMap(postParameters,defectPictureList,"defectPictureFiles",parentPath);
}
//使用MultiValueMap<String,Object>上传文件和参数
rmb=restTemplate.postForObject(Constant.MES_PRODUCTIONORDERCONFIRM_DOCONFIRMPRODUCTION,postParameters,ReturnMsgBean.class);
//删除临时文件夹
parentFile.delete();
} catch (Exception e) {
rmb.setReturnCode(ReturnMsgBean.CODE_PA);
rmb.setStatus(ReturnMsgBean.ERROR);
rmb.setReturnMsg(ReturnMsgBean.EXCEPTION);
}
return rmb;
}
解析客户端发来的文件
private void addToMultiValueMap(MultiValueMap<String,Object> param,List<MultipartFile> files,String key,String parentPath) throws IOException {
List<FileSystemResource> tmpResource = new ArrayList<>();
for (MultipartFile file : files) {
String filePath = parentPath + file.getOriginalFilename();
File tmpFile = new File(filePath);
//将MultipartFile对象持久化到临时文件夹中
file.transferTo(tmpFile);
FileSystemResource fileSystemResource = new FileSystemResource(tmpFile);
tmpResource.add(fileSystemResource);
}
param.addAll(key,tmpResource);
}
这样具体项目就可以正常处理请求