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 ...
随机推荐
- Matplotlib数据可视化(4):折线图与散点图
In [1]: from matplotlib import pyplot as plt import numpy as np import matplotlib as mpl mpl.rcParam ...
- 基于abp框架的数据库种子数据初始化
目录 基于abp框架的数据库种子数据初始化 1.背景 2.参照 3.解决方案 3.1 初始化数据 3.2 依赖注入方法容器里获取数据库上下文 3.3 封装创建初始化数据列表方法 3.4 数据库中没有的 ...
- 菜鸟系列Golang学习 — 切片
切片简介 切片也是一种数据类型,在Golang中,切片底层基于数组实现的. 我们定义切片如下 var slice []int 切片之所以出现,是为了更好的利用资源,管理数据,如果使用数组,则我们一开始 ...
- sqlserver取分组数据的最后一条数据
SQL Server中ROW_NUMBER()函数的使用 参考文章:https://blog.csdn.net/pan_junbiao/article/details/79941162 业务中的问题: ...
- 必备技能七、Vuex
这段时间一直在用vue写项目,vuex在项目中也会依葫芦画瓢使用,但是总有一种朦朦胧胧的感觉.于是决定彻底搞懂它. 看了一下午的官方文档,以及资料,才发现vuex so easy! 作为一个圈子中的人 ...
- ARC中__bridge, __bridge__transfer, __bridge_retained 关系
总结于 IOS Tuturial 中 ARC两章,详细在dropbox pdf 文档. Toll-Free Bridging 当你在 Objective-C 和 Core Foundation 对象之 ...
- Redis 中的客户端
Redis 是一个客户端服务端的程序,服务端提供数据存储等等服务,客户端连接服务端并通过向服务端发送命令,读取或写入数据,简单来说,客户端就是某种工具,我们通过它与 Redis 服务端进行通讯并完成数 ...
- 在Linux上查询物理机信息-不用去拆机器了
目录 一.查看系统信息(包含机器型号) 1.1 查看机型和品牌 二.查看CPU 信息 2.1 查看CPU 型号 2.2 查看CPU的物理数量 2.3 查看 CPU核心数量(非逻辑CPU) 2.4 查看 ...
- django 从零开始 3认识url解析
在视图函数中定义一个函数abc 接受得到的参数 并显示在页面上 urls中设置 在页面会显示出错误 找不到该url ,原因是django1版本中使用的是url和re_path ,突然django2变 ...
- Hyperledger Fabric ChainCode开发
预览 Hyperledger Fabric的chaincode开发目前支持Go.Java.Node.js语言,下面以Go语言作为例子,我们先看下面的一个官方提供chaincode模板 ··· pack ...