码迷,mamicode.com
首页 > 其他好文 > 详细

Servlet读取前端的request payload

时间:2020-04-03 22:03:51      阅读:68      评论:0      收藏:0      [点我收藏+]

标签:init   输入框   throw   mic   row   lse   throws   inf   let   

这几天遇见了一个很头疼的事,当我想用表单上传文件时,后端servlet读取不到文件的信息

网上搜索,说是要将form添加这个属性enctype="multipart/form-data"

本着刨根问底的学习态度,我知道了在enctype为multipart/form-data时,传输的信息中会多出如下所示的payload中的信息

技术图片

 

再次本着刨根问底的态度,我知道了,上面的这些信息是要在后端通过request.getInputStream方法获取输入流读取到的

读取到后,我懵了,我一个表单里又有文件组件又有其他input组件,咋办,上面就像一个大锅,把我的数据一锅炖了,只好通过自己的方法来剥离了,

于是我耗费了xx小时(一小会,哈哈),整理了一套简便的可根据组件name直接提取对应数据的小方法(不敢管这叫算法,鄙人太菜)

废话不多说,上代码!!!

前端代码一个file组件一个text组件:

技术图片

 

 后端servlet代码:

 1 public class UploadSservlet extends HttpServlet{
 2     private static final long serialVersionUID = 1L;
 3     private int[] reqdata;//用来存储初始化后inputstream中读取的数据
 4     private void initInputData(HttpServletRequest req) throws ServletException, IOException{
 5         int a;
 6         InputStream in=req.getInputStream();
 7         BufferedInputStream br=new BufferedInputStream(in);
 8         
 9         int byteslen=req.getContentLength();
10         reqdata=new int[byteslen];
11         
12         for(int i=0;(a=br.read())!=-1;i++){
13             reqdata[i]=a;
14         }
15         br.close();
16         in.close();
17     }
18     private byte[] getPayLoadValue(String name){
19         byte[] retArray;
20         int retArraybeginindex=-1,retArrayendindex=reqdata.length;
21         byte[] namebyte=("name=\""+name+"\"").getBytes();
22         int pipeindex=0;
23         int pipeilen=namebyte.length;
24         char lastchar=‘$‘;
25         char[] lastHeng=new char[6];
26         int lastHengindex=0;
27         boolean begintakeout=false;
28         
29         for(int i=0;i<reqdata.length;i++){
30             if( !begintakeout && reqdata[i]==namebyte[pipeindex] ){
31                 pipeindex++;
32                 if(pipeindex>=pipeilen){
33                     begintakeout=true;
34                 }        
35             }    
36             else
37                 pipeindex=0;
38             if(begintakeout && ((char)reqdata[i])==‘\n‘ && ((char)reqdata[i-2])==‘\n‘){
39                 retArraybeginindex=i+1;//当前位置指向回车,所以+1即为内容区域起始位置
40                 break;
41             }    
42             lastchar=(char)reqdata[i];    
43         }
44         for(int i=retArraybeginindex;i<reqdata.length;i++){
45             if((char)reqdata[i]==‘-‘){
46                 lastHeng[lastHengindex]=(char)reqdata[i];
47                 lastHengindex++;
48             }else{
49                 lastHengindex=0;
50             }
51             if(lastHengindex>=6)
52             {
53                 retArrayendindex=i-6;//i当前指向\n------最后一个-,减6指向\n,小于retArrayendindex意味着结束之前的所有
54                 break;
55             }
56         }
57         retArray=new byte[retArrayendindex-retArraybeginindex];
58         for(int i=retArraybeginindex;i<retArrayendindex;i++){
59             retArray[i-retArraybeginindex]=(byte)reqdata[i];
60         }
61         return retArray;
62         
63     }
64     @Override
65     protected void doGet(HttpServletRequest req, HttpServletResponse resp)
66             throws ServletException, IOException {
67         initInputData(req);
68         byte file[]=getPayLoadValue("uploadFile");//input 里的name是什么就传什么,获取到的byte数组就是对应文件的byte数据
69         byte name[]=getPayLoadValue("name");//input 里的name是什么就传什么,获取input输入框内的值
70         for(byte i :name){
71             System.out.print((char)i);//测试输出一下前端input传来的值
72         }
73     }
74 }

 

大概思路就是这样,就可以把getPayLoadValue当getParameter用了,只不过getPayLoadValue返回的是byte数组,自己小转一下就好了,本帖适合我这样的初学者了解其中原理,框架大佬,算法大佬勿喷- -

 

Servlet读取前端的request payload

标签:init   输入框   throw   mic   row   lse   throws   inf   let   

原文地址:https://www.cnblogs.com/efengsoft/p/12628757.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!