标签: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数组,自己小转一下就好了,本帖适合我这样的初学者了解其中原理,框架大佬,算法大佬勿喷- -
标签:init 输入框 throw mic row lse throws inf let
原文地址:https://www.cnblogs.com/efengsoft/p/12628757.html