• 接收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)方法获取参数,因为前者会将请求数据清空。

  • 相关阅读:
    EFCore实践教程三
    EFCore实践测试二
    EFCore实践测试一
    git学习3
    git学习2
    git学习1
    ABP学习
    autofac笔记
    时间计算本质理论3-平行宇宙,对未来的子线程计算
    时间计算本质理论2-时间计算速度的不同步
  • 原文地址:https://www.cnblogs.com/jerrylz/p/5112457.html
Copyright © 2020-2023  润新知