1. 程式人生 > >enctype已經設定為multipart/form-data 但request.getinputstream()仍然為null

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的這段攔截器配置後,終於得到了自己想要的結果。

以上方法確實是找到了問題的原因,由於在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"上傳檔案時,在另一個jsp頁面中通 過request.getInputStream()手動獲取二進位制流結果為null的問題原因描述 上傳檔案時,可以通過設定: enctype="m

關於http請求的header中Content-type如果multipart/form-data,是用來傳遞多種型別的引數,如又可以傳遞附件、又可以傳遞文字,在body中為什麼需要分隔符

關於http請求的header中Content-type如果為multipart/form-data,是用來傳遞多種型別的引數,如又可以傳遞附件、又可以傳遞文字,在body(注意是body中,heade

解決當FORMENCTYPE="multipart/form-data" 時request.getParameter()獲取不到值的方法

今天在原來上傳檔案頁面的基礎上,想新增一段檔案的簡介 因為同時要上傳檔案,所以ENCTYPE="multipart/form-data" 必須要加在form裡面 可是這樣的話,我再servlet裡面用request.getParameter()方法無論如何都只是獲得null值

解決當FORMENCTYPE="multipart/form-data" 時request.getParameter()獲取不到值的問題

今天在原來上傳檔案頁面的基礎上,想新增一段檔案的簡介 因為同時要上傳檔案,所以ENCTYPE="multipart/form-data" 必須要加在form裡面 可是這樣的話,我再servlet裡面用request.getParameter()方法無論如何都只是獲得null

檔案上傳下載時,在form表單中設定屬性enctype=“multipart/form-data”的情況下,如何獲取表單提交的值?

一、問題描述 檔案上傳下載時,在form表單中設定屬性enctype=“multipart/form-data”的情況下,如何獲取表單提交的有關使用者資訊的值?(比如:textfield、radio等屬性中的值) 二、解決方法 1、情況一:沒有對user物件進行封裝 方法:

為什麼上傳檔案的表單需要設定enctype="multipart/form-data"

在學習PHP檔案上傳的過程中發現,HTML表單需要設定enctype="multipart/form-data"這個屬性,雖然不這麼設定的確無法上傳,但這是為什麼呢? HTML表單如何打包資料檔案是由enctype這個屬性決定的。enctype有以下幾種取值:

SpringMVC中檔案上傳,新增enctype="multipart/form-data"後表單其他屬性

最近在做一個小型專案,用SpringMVC+Spring+Mybatis做的,開始沒有做圖片上傳,也沒有用Spring MVC做過,以前是用Struts2搞定的,所以很自然的, 在設定form表單上的屬性就用了enctype=”multipart/form-da

關於使用設定表單屬性enctype="multipart/form-data"之後傳值問題

今天做一個簡單的商城專案的時候碰到了一個問題,將前臺頁面傳過來的引數直接想當然的使用BeanUtils的populate封裝進了bean,去資料庫看發現只有自己給bean設定的值,前臺傳的一個都沒有儲存進去.查了資料發現,使用了multipart/form-data之後,表單

HTTP form表單提交數據(enctype="multipart/form-data" method="post")的服務端處理

keyword -s detail put form表單 表單提交 class eth ron 參考鏈接:http://blog.csdn.net/u010018421/article/details/52833346 <form action="fileUpload

排除在“enctype=‘multipart/form-data’”之外的MultipartException

scrip car self orm ddc oot expected 元素 返回 前不久,在提交一份<form>表單以完成文件上傳時,系統報了一個看上去比較常見的錯誤: 1 HTTP Status [500] – [Internal Server Erro

node進階| 解決表單enctype="multipart/form-data" 時獲取不到Input值的問題

分割字符串 odi logs -1 字符串 var dex 路徑 date() 今天在學習node踩到一個坑:form設置enctype="multipart/form-data"上傳文件時,無法獲取到表單其他input的值。 因為之前上傳文件用的是 formidable

form   中 enctype="multipart/form-data" 作用

form 中 enctype="multipart/form-data" 作用<form name="userInfo" method="post" action="first_submit.jsp" ENCTYPE="multipart/form-data">

enctype="multipart/form-data"的form傳參

exc time 文件 信息 傳遞 tel ctype quest earch 1、jsp <li class="btns"><input id="btnImport" class="btn btn-primary" type="button" valu

HTML enctype=“multipart/form-data”是什麼?為什麼要加?

1.什麼是multipart/form-data 首先我們需要明白在html中的enctype屬性,  enctype:規定了form表單在傳送到伺服器時候編碼方式。他有如下的三個值。  ①application/x-www-form-urlencoded。預設的編碼方式。但是在

JSP中表單加了enctype="multipart/form-data"屬性後request就接收不到表單傳過來的值的問題

  1.get方式  get方式提交的話,表單項都儲存在http header中,格式是  http://localhost:8080/hello.do?name1=value1&name2=value2這樣的字串。JSP端通過request.getPara

檔案上傳為什麼要用 enctype="multipart/form-data" ???

在檔案上傳的過程中發現,HTML表單需要設定enctype="multipart/form-data"這個屬性,雖然不這麼設定的確無法上傳,但這是為什麼呢? HTML表單如何打包資料檔案是由enctype這個屬性決定的。enctype有以下幾種取值: application/x-ww

enctype="multipart/form-data"導致text表單項失效的問題

為了上傳檔案表單項,在form表單項上設定屬性enctype="multipart/form-data"導致text表單項無法傳值 原因: 表單中enctype=”multipart/form-data”的意思,是設定表單的MIME編碼。預設情況,這個編碼格式是appli

form enctype:"multipart/form-data",method:"post" 提交表單,後臺獲取不到資料

在解決博問node.js接受引數的時候,發現當form中新增enctype:"multipart/form-data",後臺確實獲取不到資料,於是跑到百度上查了一下,終於明白為什麼了,下面轉載一下原因吧: 1.get方式  get方式提交的話,表單項都儲存在http h

formEnctype=multipart/form-data 的作用

ENCTYPE="multipart/form-data"用於表單裡有圖片上傳。 <form name="userInfo" method="post" action="first_submit.jsp"    ENCTYPE="multipart/form-da

為什麼上傳檔案的表單裡面要加一個屬性enctype=multipart/form-data

首先知道enctype這個屬性管理的是表單的MIME編碼。共有三個值可選: 1、application/x-www-form-urlencoded 2、multipart/form-data 3、text/plain 其中application/x-www-form-url