原文链接: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"%>
分享到:
相关推荐
Struts框架是一个基于MVC(Model-View-Controller)设计模式的Java Web开发框架,它为构建企业级应用提供了强大的支持。在Web开发中,图片上传功能是非常常见且实用的,而生成缩略图则是对上传图片进行处理的重要...
注意,表单的`enctype`属性必须设置为`multipart/form-data`,以便传输二进制文件数据。 2. **Struts1配置** 在Struts的配置文件(如struts-config.xml)中,我们需要定义一个处理图片上传的Action。这个Action将...
通常需要在JSP页面中使用Struts的HTML标签库来创建一个表单,该表单需要设置`enctype`属性为`multipart/form-data`。这表明表单将提交包含二进制数据(例如文件)的数据。以下是一个简单的文件上传页面示例: ```...
在Struts的配置文件(通常为struts-config.xml)中,需要定义一个处理文件上传的动作。这个动作将映射到处理文件上传的Action类。 ```xml <action path="/upload" type=...
对于文件上传,Action类需要继承`org.apache.struts2.actions.upload.FileUploadAction`基类,并且需要处理`multipart/form-data`类型的请求。 创建上传页面,我们使用JSP来构建用户界面。页面包含一个文件输入框和...
在Struts2中,文件上传是常见的功能,尤其在处理用户提交的表单时,如图片、文档等文件的上传。本教程将深入探讨如何使用Struts2实现实现多文件上传,并提供两种不同的实现方法。 ### 方法一:基于`Commons ...
在处理文件上传时,我们需要使用`HttpServlet`和`Part`接口,这是Java EE 7引入的用于处理multipart/form-data类型请求的特性。 1. **创建HTML表单** 文件上传的第一步是创建一个HTML表单,允许用户选择要上传的...
在Web应用中,用户通常通过表单提交文件,表单的`enctype`属性必须设置为`multipart/form-data`,以便浏览器可以处理包含文件的数据。Struts2提供了FileUpload拦截器来处理这种类型的表单提交。在配置Struts2的...