enctype已经设置为multipart/form-data 但request.getinputstream()仍然为null
来源:互联网 发布:js div的显示与隐藏 编辑:程序博客网 时间:2024/05/22 13:53
struts2开发环境中,通过设置enctype="multipart/form-data"上传文件时,在另一个jsp页面中通
过request.getInputStream()手动获取二进制流结果为null的问题原因描述
上传文件时,可以通过设置:
enctype="multipart/form-data"
method="post"
然后在接收页面中通过
request.getInputStream();
获取二进制流
今天在struts2环境下通过这种方式传递,却发现了一个奇怪的现象:request.getInputStream();的结果为null
为验证请求是否真的为null,通过下面的方式居然可以输出的 len是大于0的,从而可以说明数据是传递过来了,就是发起请求的页面应该没用问题。
int len = request.getContentLength();
out.println("len: " + len + "<br>");
那为什么request.getInputStream()结果就为null呢,
于是就换了另外一种获取二进制流的方式
request.getReader();
结果问题就暴露出来了:
org.apache.jasper.JasperException: An exception occurred processing JSP page /chapter6/pro.jsp at line 26
23: //InputStream is = request.getInputStream();
24:
25: //已HTTP请求输入流建立一个BufferedReader对象
26: BufferedReader br = request.getReader();//new BufferedReader(new InputStreamReader(is));
27:
28: //读取HTTP请求内容
29: String buffer = null;
Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:524)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:429)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:389)
root cause
java.lang.IllegalStateException: getInputStream() has already been called for this request
org.apache.catalina.connector.Request.getReader(Request.java:1125)
org.apache.catalina.connector.RequestFacade.getReader(RequestFacade.java:470)
javax.servlet.ServletRequestWrapper.getReader(ServletRequestWrapper.java:248)
org.apache.jsp.chapter6.pro_jsp._jspService(pro_jsp.java:80)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:389)
org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:389)
通过异常信息可以看出,原来我一心想得到的输入流被struts2的拦截器给拦截了,导致我再次读取流的时候只有null了。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!--
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
-->
</web-app>
通过屏蔽struts2的这段拦截器配置后,终于得到了自己想要的结果。
以上方法确实是找到了问题的原因,由于在web.xml中配置拦截器时,<url-pattern>/*</url-pattern>表示拦截一切的请求,所以struts2的拦截器将发送给pro.jsp的请求给拦截了,在拦截器里面request经过一系列的转换已经不是初始发送过来的request了,所以总是在request.getInputStream()时取到null。但是如果为了解决这个问题而去掉struts2的拦截器功能,显得太过了,此处可以修改<url-pattern>/*</url-pattern>为<url-pattern>*.action</url-pattern>,只拦截以action为后缀的请求。想jsp发送的request将不会被拦截到。
- enctype已经设置为multipart/form-data 但request.getinputstream()仍然为null
- (转)struts2开发环境中,enctype="multipart/form-data"上传文件时,request.getInputStream()为null
- struts2开发环境中,enctype="multipart/form-data"上传文件时,request.getInputStream()为null的原因
- FORM的ENCTYPE="multipart/form-data" 时request.getParameter()值为null问题的解决
- FORM的ENCTYPE="multipart/form-data" 时request.getParameter()值为null问题的解决
- FORM的ENCTYPE="multipart/form-data" 时request.getParameter()值为null问题的解决
- form表单-request得不到值为null-以及Enctype=multipart/form-data介绍
- struts2开发环境中,enctype="multipart/form-data"上传文件时,request.getInputStream()为null的原因(转http://topic.csdn.net/u/20101210/11/78454a19-7
- 提交设置为enctype="multipart/form-data"的表单时中文乱码解决
- 利用form从Jsp到Servlet传值为NULL问题(enctype="multipart/form-data")(fileupload)
- 表单提交 enctype="multipart/form-data"的时候 request.getparameter取值为空的问题
- struts中enctype="multipart/form-data",request.getParameter("file") 是null的问题分
- struts中enctype="multipart/form-data",request.getParameter("file") 是null的问题分
- 当form为enctype="multipart/form-data"时的代码
- spring form 提交类型为 enctype="multipart/form-data"时需配置multipartResolver
- enctype="multipart/form-data 无法通过request得到值
- 关于enctype="multipart/form-data" ,后台request.getParameterMap()
- request.getParameterValues()与enctype="multipart/form-data"不能共用
- source insight 2
- 做mapreduce join时遇到的问题
- input只能输入数字和小数点
- 笔试题四:带头节点head两个链表合并,并且有序
- perl入门
- enctype已经设置为multipart/form-data 但request.getinputstream()仍然为null
- 【总结】Python 2.x中常见字符编码和解码方面的错误及其解决办法
- poj1067(威佐夫博弈)
- 从支付宝获取的跳转提示
- 笔试题五:实现输出矩阵 二维数组
- 公司,文化,团队,加班,建议
- 只运行一个实例的例程
- 4.5兼模拟卡牌动作和动作组合
- xcode 程序入口