原文链接: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"%>
分享到:
相关推荐
解决上传文件enctype= multipart/form-data 时无法传递其他参数的问题,以及项目全局编码问题。用的插件是commons io + commons fileupload
解决当FORM的ENCTYPE="multipart/form-data" 时request.getParameter()获取不到值的方法 ?
servlet上传 enctype="multipart/form-data" servlet上传 enctype="multipart/form-data
解决当FORM的ENCTYPE="multipart/form-data" 时action方法或者控制层用request.getParameter()获取不到值的方法 ?
解决java enctype multipart form-data文件上传传值问题 不使用jspsmartupload组件 可以轻轻松松 解决传值问题
我们都知道要让form能提交文件,需要在form上指定enctype=multipart/form-data的attribute,这样才能上传文件,关于enctype的文章很多,就不再做解释。 问题是因为使用了MVC的Html.BeginForm()来输出表单代码,默认...
<form method="post" ENCTYPE="multipart/form-data"> file类型职务的普通参数传递到后台问题解决
本文介绍了Node Js 使用KOA处理form-data格式传输过来的文件,分享给大家。...form表单【注意:enctype=”multipart/form-data”】上传文件时,首先会将文件上传到你本机的temp目录,然后执行move_upload_file
阿贾克斯形式这是一个js事件监听器,可让您以最简单的方式使用ajax提交任何表单。 只需将类“ .ajax_form”添加到您的表单中,瞧,您的表单将开始... 只需将常规enctype =“ multipart / form-data”包含在表单元素中
穆特尔 Multer是用于处理multipart/form-data的node.js中间件,主要用于上传文件。 它是在之上编写的,以实现最大效率。 注意:Multer将不处理任何非多multipart/form-data ( multipart/form-data )。翻译该自述...
本文实例讲述了Django框架文件上传与自定义图片上传路径、上传文件名操作。分享给大家供大家参考,具体如下: ...method=post enctype=multipart/form-data> 文件数据存储在request.FILES属性中 文件上传必须使用P
2.其次JSP页面中的文件上传控件所在的form必须设置属性enctype="multipart/form-data" 3.再次,struts2中文件上传将底层高度封装了。在使用时只需要在ACTION中添加三个字段(其中 List<File> files为必填项),...
encType="multipart/form-data" 根据上传不同,主要分两步,可以有效的解决request.getParameter(String s)是null值
<form action="fileup.do" method="post" enctype="multipart/form-data" > 文件:<input type="file" name="filedata"/> 2.struts-config.xml文件配置 <form-beans> <form-bean name="actionForm" ...
multipart/form-data : 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。 text/plain : 窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。 补充 form的enctype属性为编码方式,常用有...
struts2文件上传与下载, <s:form name="Myform" action="/fileManage/upload" method="post" enctype="multipart/form-data" theme="simple" > <s:fielderror></s:fielderror> <s:file name="image" label=...
开发文件上传表单页面 在实现文件上传时,首先需要设置文件上传表单,这个表单的提交方式必须为POST。另外,还需要增加上传的属性enctype= “multipart/form-data”,该属性说明浏览器可以提供文件上传功能。 2.编写...
控件,form 表单需要设置 enctype=”multipart/form-data” 属性。比如: <body> <form action=UploadFile.php method=post enctype=multipart/form-data> <input type=file name=fileUpload /&...
注意的问题是文件上传的时候的enctype="multipart/form-data" 如果设置错误会报错 今天初次使用Struts 2做文件上传,出现了一个错误, ognl.MethodFailedException: Method "setUpload" failed for object 文件...