struts2开发环境中,enctype="multipart/form-data"上传文件时,request.getInputStream()为null的原因
来源:互联网 发布:尤氏 知乎 编辑:程序博客网 时间:2024/05/21 11:36
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的这段拦截器配置后,终于得到了自己想要的结果。
虽然在真正的项目中都有比较成熟的框架提供上传下载的功能,但是最基础最简单的实现方式,对于学习理解还是很有帮助的,
愿我的一点粗浅认识会对需要的朋友有所帮助和启发。
首次发帖,望朋友们多多支持!3Q
下面将两个测试的jsp页面贴出,以供大家参考。
说明:本文主要为了说明struts2拦截器从中拦截了请求导致不能再读取到该流,
该测试页面只到获取到二进制流,后续的解析流格式和写文件没有涉及。
发起页面:enctypeTest.jsp
<%@page language="java" contentType="text/html;charset=GBK" pageEncoding="GBK"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'enctypeTest.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<!-- 设置表单的 enctype 属性为 multipart/form-data -->
<form id="form1" name="form1"
enctype="multipart/form-data" method="post"?
action="chapter6/pro.jsp">
上传文件:
<input type="file" name="file" />
<br>
请求参数:
<input type="text" name="wawa" />
<br>
<input name="dd" type="submit" value="提交" />
</form>
</body>
</html>
接收页面:pro.jsp
<%@page language="java" contentType="text/html;charset=GBK"
pageEncoding="GBK"%>
<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'pro.js
- struts2开发环境中,enctype="multipart/form-data"上传文件时,request.getInputStream()为null的原因
- (转)struts2开发环境中,enctype="multipart/form-data"上传文件时,request.getInputStream()为null
- struts2开发环境中,enctype="multipart/form-data"上传文件时,request.getInputStream()为null的原因(转http://topic.csdn.net/u/20101210/11/78454a19-7
- FORM的ENCTYPE="multipart/form-data" 时request.getParameter()值为null问题的解决
- FORM的ENCTYPE="multipart/form-data" 时request.getParameter()值为null问题的解决
- FORM的ENCTYPE="multipart/form-data" 时request.getParameter()值为null问题的解决
- struts中post方式上传文件,enctype="multipart/form-data",request.getParameter("file") 是null的问题分析
- enctype已经设置为multipart/form-data 但request.getinputstream()仍然为null
- struts中enctype="multipart/form-data",request.getParameter("file") 是null的问题分
- struts中enctype="multipart/form-data",request.getParameter("file") 是null的问题分
- 表单中存在上传文件时设置enctype="multipart/form-data"的问题
- form表单-request得不到值为null-以及Enctype=multipart/form-data介绍
- 在form中上传文件与Enctype=multipart/form-data 的作用
- springmvc文件上传与表单为enctype="multipart/form-data" 的数据绑定
- 文件上传 form 表单 enctype="multipart/form-data" 分析
- 文件上传form属性:enctype=multipart/form-data
- 文件上传 enctype multipart/form-data
- 对于form enctype= multipart/form-data 二进制流上传文件,服务器端获取不到表单中其他数据的解决办法。
- Hibernate的基本检索方式介绍
- leetcode:Sqrt(x) 菜鸟解法
- 2014CVPR_物体检测论文
- 独立开发者:新手做2D手游该用哪些工具?
- Java程序员从笨鸟到菜鸟之(四十八)细谈struts2(十)ognl概念和原理详解
- struts2开发环境中,enctype="multipart/form-data"上传文件时,request.getInputStream()为null的原因
- 无限的路
- Head First---状态模式
- HDU 3458 Enumerate the Triangles(最小周长三角形)
- JavaScript社区开发者调查:服务端JS盛行 AngularJS使用者最多
- Ubuntu下crontab命令的用法
- UVA 1393 - Highways
- 结构型模式之Decorator模式
- Java程序员从笨鸟到菜鸟之(四十九)细谈struts2(十一)OGNL表达式的基本语法和用法