在完成一个在线学生作业管理系统的时候,涉及到“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后面,指定名字和值,但是这样的一般传固定值,对于通过界面与用户交互得到的值,最好按照上面提到的方式。