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

 

转载于:https://www.cnblogs.com/jerrylz/p/5112457.html

### 回答1: content-type: multipart/form-data 是一种 HTTP 请求头部的格式,用于在 HTTP 请求中传输二进制数据,例如上传文件。它允许将多个不同类型的数据一起发送到服务器,每个数据块都有自己的 MIME 类型和边界分隔符。这种格式通常用于表单提交和文件上传。 ### 回答2: content-type: multipart/form-data是HTTP协议中的一个请求头字段,用于指定请求体的数据格式为多部分表单数据。该数据格式常用于上传文件等需要传递二进制数据的场景。 multipart/form-data数据格式的特点是将请求体数据划分为多个部分,每个部分都是一个独立的数据块,块之间用分隔符进行分隔。每个数据块都包含一个头部和一个内容部分。 头部是一个描述数据块的字符串,包含了元数据信息,如Content-Disposition和Content-Type等。其中Content-Disposition常用于指定数据块的名称、文件名和传输方式。Content-Type常用于指定数据块的媒体类型。 内容部分是实际的数据内容,可以是文本、二进制等形式。对于文件上传,内容部分通常是二进制的文件数据。 通过使用multipart/form-data格式,客户端可以将多个不同类型的数据(例如文本表单字段和文件等)一同提交给服务器端。服务器端可以通过解析请求体数据,逐个读取和处理各个数据块,从而实现文件上传等功能。 总之,content-type: multipart/form-data是一种用于上传文件等二进制数据的HTTP请求数据格式,具有分块、包含元数据的特点,可以在客户端和服务器端传输多部分表单数据。 ### 回答3: content-type: multipart/form-data是HTTP协议中的一种数据传输格式,主要用于在客户端和服务器之间传递带有文件上传的表单数据。 在HTTP请求中,表单数据通常使用键值对的形式进行传输,例如key1=value1&key2=value2。然而,当表单中包含文件上传时,使用这种形式无法传递文件数据。这时就需要使用multipart/form-data格式。 使用multipart/form-data格式时,请求体被划分为多个部分(part),每个部分包含一个表单字段或一个文件。每个部分使用boundary作为分隔符,用于区分不同的字段或文件。 对于每个表单字段,请求体的一部分将包含字段的键名和值。对于文件,请求体的一部分将包含字段的键名、文件名以及文件的二进制数据。值得注意的是,multipart/form-data格式不对文件进行任何编码或压缩,直接发送原始的二进制数据。 使用multipart/form-data格式时,请求头中的Content-Type字段即为content-type: multipart/form-data,同时指定boundary参数来标识分隔符的字符串。 服务器端在接收到这样的请求后,可以解析请求体,提取其中的表单字段和文件数据,并进行相应的处理。常用的服务器端框架和编程语言都提供了处理这种格式的工具和库。 总之,content-type: multipart/form-data是一种用于在HTTP请求中传递带文件上传的表单数据的格式,在客户端和服务器之间进行数据传输时使用,以便实现文件上传功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值