一、問題描述
最近在寫接口程序,該接口需要與其他公司的程序對接。對方發送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)方法獲取參數,因為前者會將請求數據清空。
