应用场景
前端请求后端上传单个或多个文件,同时携带其他参数,后端再转发到第三方服务。
思路
- 拿到前端提交的multipart参数
- 读取参数并区分文件/其他参数
- 请求第三方
实现
拿到前端提交的参数并解析到MultiValueMap:
private static MultiValueMap<String, Object> parseMultipart(ServerRequest request) {MultiValueMap<String, Object> multiValueMap = null;try {HttpServletRequest httpServletRequest = request.servletRequest();Collection<Part> parts = httpServletRequest.getParts();multiValueMap = new LinkedMultiValueMap<>();for (Part part : parts) {String fileName = part.getSubmittedFileName();// 其他普通参数if (StringUtils.isBlank(fileName)) {ContentType parseContentType = ContentType.parse(part.getContentType());multiValueMap.add(part.getName(), IoUtil.read(part.getInputStream(), parseContentType.getCharset()));}// 文件else {multiValueMap.add(part.getName(), new InputStreamResource(part.getInputStream()) {@Overridepublic long contentLength() {return part.getSize();}@Overridepublic String getFilename() {return part.getSubmittedFileName();}});}}} catch (IOException | ServletException e) {throw new RuntimeException(e);}return multiValueMap;}
发起请求:
HttpEntity<Object> httpEntity = new HttpEntity<>(requestDto.getMultipartMap(), requestDto.getHeaders());
String response = restTemplate.exchange(url, httpMethod, httpEntity, String.class);