Servlet讀取前端的request payload

這幾天遇見了一個很頭疼的事,當我想用表單上傳文件時,後端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數組,自己小轉一下就好了,本帖適合我這樣的初學者了解其中原理,框架大佬,算法大佬勿噴- –