Servlet读取前端的request payload
这几天遇见了一个很头疼的事,当我想用表单上传文件时,后端servlet读取不到文件的信息
网上搜索,说是要将form添加这个属性enctype="multipart/form-data"
本着刨根问底的学习态度,我知道了在enctype为multipart/form-data时,传输的信息中会多出如下所示的payload中的信息

再次本着刨根问底的态度,我知道了,上面的这些信息是要在后端通过request.getInputStream方法获取输入流读取到的
读取到后,我懵了,我一个表单里又有文件组件又有其他input组件,咋办,上面就像一个大锅,把我的数据一锅炖了,只好通过自己的方法来剥离了,
于是我耗费了xx小时(一小会,哈哈),整理了一套简便的可根据组件name直接提取对应数据的小方法(不敢管这叫算法,鄙人太菜)
废话不多说,上代码!!!
前端代码一个file组件一个text组件:

后端servlet代码:
public class UploadSservlet extends HttpServlet{
private static final long serialVersionUID = 1L;
private int[] reqdata;//用来存储初始化后inputstream中读取的数据
private void initInputData(HttpServletRequest req) throws ServletException, IOException{
int a;
InputStream in=req.getInputStream();
BufferedInputStream br=new BufferedInputStream(in);
int byteslen=req.getContentLength();
reqdata=new int[byteslen];
for(int i=0;(a=br.read())!=-1;i++){
reqdata[i]=a;
}
br.close();
in.close();
}
private byte[] getPayLoadValue(String name){
byte[] retArray;
int retArraybeginindex=-1,retArrayendindex=reqdata.length;
byte[] namebyte=("name=\""+name+"\"").getBytes();
int pipeindex=0;
int pipeilen=namebyte.length;
char lastchar='$';
char[] lastHeng=new char[6];
int lastHengindex=0;
boolean begintakeout=false;
for(int i=0;i<reqdata.length;i++){
if( !begintakeout && reqdata[i]==namebyte[pipeindex] ){
pipeindex++;
if(pipeindex>=pipeilen){
begintakeout=true;
}
}
else
pipeindex=0;
if(begintakeout && ((char)reqdata[i])=='\n' && ((char)reqdata[i-2])=='\n'){
retArraybeginindex=i+1;//当前位置指向回车,所以+1即为内容区域起始位置
break;
}
lastchar=(char)reqdata[i];
}
for(int i=retArraybeginindex;i<reqdata.length;i++){
if((char)reqdata[i]=='-'){
lastHeng[lastHengindex]=(char)reqdata[i];
lastHengindex++;
}else{
lastHengindex=0;
}
if(lastHengindex>=6)
{
retArrayendindex=i-6;//i当前指向\n------最后一个-,减6指向\n,小于retArrayendindex意味着结束之前的所有
break;
}
}
retArray=new byte[retArrayendindex-retArraybeginindex];
for(int i=retArraybeginindex;i<retArrayendindex;i++){
retArray[i-retArraybeginindex]=(byte)reqdata[i];
}
return retArray;
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
initInputData(req);
byte file[]=getPayLoadValue("uploadFile");//input 里的name是什么就传什么,获取到的byte数组就是对应文件的byte数据
byte name[]=getPayLoadValue("name");//input 里的name是什么就传什么,获取input输入框内的值
for(byte i :name){
System.out.print((char)i);//测试输出一下前端input传来的值
}
}
}
大概思路就是这样,就可以把getPayLoadValue当getParameter用了,只不过getPayLoadValue返回的是byte数组,自己小转一下就好了,本帖适合我这样的初学者了解其中原理,框架大佬,算法大佬勿喷- -
Servlet读取前端的request payload的更多相关文章
- 前端用Request Payload方式请求后台
后台接收方式: InputStream inputStream = request.getInputStream(); byte[] buff = new byte[1024]; int len = ...
- AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
转载:http://blog.csdn.net/mhmyqn/article/details/25561535 HTTP请求中,如果是get请求,那么表单参数以name=value&name1 ...
- AJAX POST请求中參数以form data和request payload形式在servlet中的获取方式
HTTP请求中,假设是get请求,那么表单參数以name=value&name1=value1的形式附到url的后面,假设是post请求,那么表单參数是在请求体中,也是以name=value& ...
- [转]AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
转载至 http://blog.csdn.net/mhmyqn/article/details/25561535 最近在写接收第三方的json数据, 因为对java不熟悉,有时候能通过request能 ...
- HTTP请求中的Form Data与Request Payload的区别
前端开发中经常会用到AJAX发送异步请求,对于POST类型的请求会附带请求数据.而常用的两种传参方式为:Form Data 和 Request Payload. GET请求 使用get请求时,参数会以 ...
- 【转】HTTP请求中的form data和request payload的区别
jQuery的ajax方法和post方法分别发送请求,在后台Servlet进行处理时结果是不一样的,比如用$.ajax方法发送请求时(data参数是一个JSON.stringify()处理后的字符串, ...
- [转]HTTP请求中的form data和request payload的区别
本文转自:http://www.cnblogs.com/btgyoyo/p/6141480.html jQuery的ajax方法和post方法分别发送请求,在后台Servlet进行处理时结果是不一样的 ...
- python爬虫如何POST request payload形式的请求
python爬虫如何POST request payload形式的请求1. 背景最近在爬取某个站点时,发现在POST数据时,使用的数据格式是request payload,有别于之前常见的 POST数 ...
- HTTP 请求中的 Form Data 与 Request Payload 的区别
HTTP 请求中的 Form Data 与 Request Payload 的区别 前端开发中经常会用到 AJAX 发送异步请求,对于 POST 类型的请求会附带请求数据.而常用的两种传参方式为:Fo ...
随机推荐
- 使用Navicat或者其他数据库工具连接阿里云EDS(数据库服务器)实例过程详解
使用Navicat或者其他数据库工具连接阿里云EDS(数据库服务器)实例过程详解 背景:这几天从阿里云上面购买了云服务器,最垃圾的那种,还送oss和EDS数据库服务器,只不过EDS数据库服务器只有一个 ...
- 下载cv2时下载失败或下载成功却无法使用怎么办
最近我也在安装cv2的时候遇到了奇怪的问题,导致在安装cv2的时候无法使用.我在网上查了各种资料,虽然都对的,但都不太全面.本文就把安装cv2时可能遇到的各种奇怪的问题的解决方案做一个总结,供大家参考 ...
- 7-43 jmu-python-字符串异常处理 (20 分)
输入一行字符串及下标,能取出相应字符.程序能对不合法数据做相应异常处理. 输入格式: 行1:输入一字符串 行2:输入字符下标 输出格式: 下标非数值异常,输出下标要整数 下标越界,输出下标越界 数据正 ...
- Ubuntu pppoe宽带拨号相关问题
因为可视化界面没有相关设置,因此采用终端命令的方法. 测试环境:Ubuntu 18.0.4 pppoe的配置:$ sudo pppoeconf 然后进入此界面进行一系列宽带拨号的设置. 联网:$ su ...
- 服务器推送 SSE 了解一下?
hello~亲爱的看官老爷们大家好~过完年第一周已经结束,是时候开始制定新的工作计划了.主要负责的项目是数据可视化平台,而使用中如果服务器能有推送能力让页端得到相关通知的话,就能实现很多功能上的优化. ...
- 对javaweb项目中web.xml重用配置的理解(个人学习小结)
<!-- 所有的总结描述性与语言都在注释中 --><?xml version="1.0" encoding="UTF-8"?> < ...
- PyCharm设置远程虚拟环境
1. 创建项目 2. 配置解释器 1. 先打开srttings 2. 选择配置解释器选项 3. 配置远端虚拟环境 4. 成功提示 5. 查看pip列表信息 经过以上操作,PyCharm设置远程虚拟环境 ...
- 大龄IT人的新的一年
一转眼,工作十几年了,之前由于有时要出差,孩子偶尔放回老家,有时到处找人看孩子,虽然不出差时都是有我来带,孩子还是和我很亲,但是一直没时间关注她的学习,只是睡前读读绘本,报了个英语培训班,偶尔玩玩识字 ...
- 关于QThread使用锁死的探索
在学习使用QT5的时候,发现要使用多线程处理多任务,按照https://www.cnblogs.com/liming19680104/p/10397052.html等很多网上的方法,测试一下,发现我写 ...
- Java Grammar(三):修饰符
简介 修饰符是用于限定类型以及类型成员申明的一种符号,从修饰对象上可以分为类修饰符,方法修饰符,变量修饰符:从功能上可以划分为访问控制修饰符和非访问修饰符.访问修饰符控制访问权限,不同的访问修饰符有不 ...