接收content-type:multipart/form-data类型的参数

一、问题描述  

  最近在写接口程序,该接口需要与其他公司的程序对接。对方发送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)方法获取参数,因为前者会将请求数据清空。

 

posted @ 2016-01-08 11:02  向南君  阅读(9591)  评论(0)    收藏  举报