这几天遇见了一个很头疼的事,当我想用表单上传文件时,后端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的更多相关文章

  1. 前端用Request Payload方式请求后台

    后台接收方式: InputStream inputStream = request.getInputStream(); byte[] buff = new byte[1024]; int len = ...

  2. AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式

    转载:http://blog.csdn.net/mhmyqn/article/details/25561535 HTTP请求中,如果是get请求,那么表单参数以name=value&name1 ...

  3. AJAX POST请求中參数以form data和request payload形式在servlet中的获取方式

    HTTP请求中,假设是get请求,那么表单參数以name=value&name1=value1的形式附到url的后面,假设是post请求,那么表单參数是在请求体中,也是以name=value& ...

  4. [转]AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式

    转载至 http://blog.csdn.net/mhmyqn/article/details/25561535 最近在写接收第三方的json数据, 因为对java不熟悉,有时候能通过request能 ...

  5. HTTP请求中的Form Data与Request Payload的区别

    前端开发中经常会用到AJAX发送异步请求,对于POST类型的请求会附带请求数据.而常用的两种传参方式为:Form Data 和 Request Payload. GET请求 使用get请求时,参数会以 ...

  6. 【转】HTTP请求中的form data和request payload的区别

    jQuery的ajax方法和post方法分别发送请求,在后台Servlet进行处理时结果是不一样的,比如用$.ajax方法发送请求时(data参数是一个JSON.stringify()处理后的字符串, ...

  7. [转]HTTP请求中的form data和request payload的区别

    本文转自:http://www.cnblogs.com/btgyoyo/p/6141480.html jQuery的ajax方法和post方法分别发送请求,在后台Servlet进行处理时结果是不一样的 ...

  8. python爬虫如何POST request payload形式的请求

    python爬虫如何POST request payload形式的请求1. 背景最近在爬取某个站点时,发现在POST数据时,使用的数据格式是request payload,有别于之前常见的 POST数 ...

  9. HTTP 请求中的 Form Data 与 Request Payload 的区别

    HTTP 请求中的 Form Data 与 Request Payload 的区别 前端开发中经常会用到 AJAX 发送异步请求,对于 POST 类型的请求会附带请求数据.而常用的两种传参方式为:Fo ...

随机推荐

  1. Docker 运行容器 CentOS7 使用systemctl 启动报错 Failed to get D-Bus connection: Operation not permitted

    原系统:Centos 7 Docker 版本:1.12.6 操作:安装并运行 Tomcat 问题:在创建好容器之后,并且进入系统运行启动tomcat [root@cd11558d3a22 /]# sy ...

  2. k8s环境部署.net core web项目(docker本地仓库)

    在之前的文档中,我们部署了.net core web在k8s环境下,达成了集群管理项目的目的.但是,由于是本地部署,需要在所有的node节点都拉取好镜像,这是非常麻烦的,为了只维护一份代码,同步更新. ...

  3. SIP 协议详解

    SIP 协议详解 2013年参与过一个"视频通讯的App"项目,使用Sip协议通信.当时通信协议这块不是自己负责,加上时间紧.任务重等方面的原因,一直未对Sip协议进行过深入的了解 ...

  4. Yuchuan_Linux_C 编程之十 进程及进程控制

    一.整体大纲 二.基础知识 1. 进程相关概念 1)程序和进程 程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(cpu.内存.打开的文件.设备.锁....)     进程,是一个抽象的概念,与 ...

  5. 桌面运维之Windows快捷键,每一个工程师都是“快捷键”的工程师!

    1.win快捷键 首先教大家win7新增的3D效果: Win + Tab 快速切换已打开的程序(和Alt+tab一样的效果) Win + Home 将所有使用中窗口以外的窗口最小化 Win + Spa ...

  6. sublime text3 搭建c++/c环境

    sublime搭建的c++/c使用很方便,实用性很强,自己阅览了无数的博客,csdn,博客园的都看了,最后还是自己摸索着搭建成功了,如果觉得还不错请给个评论谢谢.(提前声明本人专利不允许转载!!!!) ...

  7. vue 带参数的跳转-完成一个功能之后 之后需要深思,否则还会忘记

    我要写详细点,否则下次很容易忘记 写了一个页面,这个页面里面添加了 很多a 标签,跳转都是同一个页面,内容不一样,方法 首先 路由 设定好 routes:[ { path:'/aaa', name:' ...

  8. 使用ajax提交登录

    引入jquery-1.10.2.js或者jquery-1.10.2.min.js 页面 <h3>后台系统登录</h3> <form name="MyForm&q ...

  9. Python面向对象之反射,双下方法

    一. 反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...

  10. 微信公众号 H5页面 支付注意细节

    1.   当秘钥(AppSecretApplets) 有问题时注意是不是已经被重置过了,此时要注意获取最新的秘钥: 2.   调试时后端的东西要放在线上https 请求 不然在手机上测试时 会被拦截: ...