一、问题描述
最近在写接口程序,该接口需要与其他公司的程序对接。对方发送content-type:multipart/form-data类型的参数,结果通过request.getParameter(param)方法怎么也获取不到参数。
二、解决方案
1、通过request.getInputStream()方法获取输入流,然后再截取自己需要的字符串(参数),如下(参考代码)
ServletInputStream in = request.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in)); StringBuilder sb = new StringBuilder(); String line; while((line = br.readLine()) != null){ sb.append(line); } //String param = sb.substring(sb.indexOf(""), sb.lastIndexOf("")+1);
2、通过apache-commons组件实现。需要jar包:commons-fileupload-1.3.1.jar,commons-io-2.4.jar。如下(参考代码)
//解析参数 private Map<String, String> getParams(HttpServletRequest request) { DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); upload.setHeaderEncoding("UTF-8"); List<FileItem> items; Map<String, String> param = null; try { items = upload.parseRequest(request); param = new HashMap<String, String> (); for(FileItem fileItem:items){ if (fileItem.isFormField()) { param.put(fileItem.getFieldName(), fileItem.getString("utf-8"));//如果你页面编码是utf-8的 } } } catch (FileUploadException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return param; }
通过调用该方法,获取参数map,然后用map.get(paramName),获取相应参数的值。
3、springmvc框架方式。需要配置CommonsMultipartResolver。如下(参考代码)
<!-- 配置Multipart解析器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:maxUploadSize="500000"></bean>
在controller通过以下方式获取参数名为"content"的值,如下(参考代码)
@RequestMapping(value = "/importOrder", method = RequestMethod.POST ) public String importOrder(@RequestParam(value="content") String content){
content = new String(content.getBytes("ISO-8859-1"), "utf-8"); System.out.println(content); return "success"; }
三、总结
两种方法,相对来说第二种更好一些。不过需要注意的是:如果先调用了request.getInputStream()方法,则不能再用request.getParameter(param)方法获取参数,因为前者会将请求数据清空。