接收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)方法獲取參數,因為前者會將請求數據清空。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM