您的位置:首页 > 编程语言 > Java开发

(转)struts2开发环境中,enctype="multipart/form-data"上传文件时,request.getInputStream()为null

2013-07-25 11:22 756 查看
原文链接:http://www.myexception.cn/j2ee/174340.html

struts2开发环境中,enctype="multipart/form-data"上传文件时,request.getInputStream()为null的原因

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"%>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐