在完成一個在線學生作業管理系統的時候,涉及到“jsp表單向servlet同時傳文件和普通文本框的值”的問題,在此貼出解決方案。
先給出一段jsp代碼,利用form表單,向SubjectfilesServlet傳文件和普通文本框的值,注意加紅的部分。
<center>
<form method="post" action="SubjectfilesServlet" enctype="multipart/form-data">
<input ID = name type = "text" name="name"/>
<br><br>
<input ID = day type = "text" name="day"/>
<br><br>
<input ID = sub type="file" name="uploadFile" />
<br><br>
</form>
注意到,傳文件到時候,form表單需要有enctype="multipart/form-data"的參數,但是一旦帶了這個參數,就不能在SubjectfilesServlet中利用request.getParameter("name")的方式獲取普通文本框的值了(可以嘗試一下,得到的全部爲null)。爲了解決這一問題,可以在SubjectfilesServlet中進行操作:
工程中加入commons-fileupload和commons,然後加入以下代碼:
// 配置上傳參數
DiskFileItemFactory factory = new DiskFileItemFactory();//設置內存臨界值 - 超過後將產生臨時文件並存儲於臨時目錄中
factory.setSizeThreshold(MEMORY_THRESHOLD);
// 設置臨時存儲目錄
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
ServletFileUpload upload = new ServletFileUpload(factory);
//設置最大文件上傳值ֵ
upload.setFileSizeMax(MAX_FILE_SIZE);
// 設置最大請求值 (包含文件和表單數據)
upload.setSizeMax(MAX_REQUEST_SIZE);
//中文處理
upload.setHeaderEncoding("UTF-8");
List<FileItem> formItems = upload.parseRequest(request); //這一個行非常重要,對上傳流進行分離
利用for循環迭代表單數據
for (FileItem item : formItems) {if (!item.isFormField()) {
// 這裏爲上傳文件的操作
}
else{
//這裏就是普通文本框的內容,調用下面的命令,即可得到回傳的文本框的值
name = item.getString();
}
對於普通的字符串,還可以加在form表單的action後面,指定名字和值,但是這樣的一般傳固定值,對於通過界面與用戶交互得到的值,最好按照上面提到的方式。