最近在解决Servlet文件上传方面遇到了一个问题,就是通过multipart/form-data这个表单类型提交要上传的文件的时候,所跳到的Servlet或者JSP页面无法用request.getParameter()方法获取非文件的字段值。
问题详细描述:
文件上传的JSP页面的form如下:
<form name="fileupload" action="mnt/fileupload" method="post" enctype="multipart/form-data" οnsubmit="return checkupload()">
<p><input type="file" name="filename"/></p>
<p>标题:<input type="text" name="ftitle" /></p>
<input type="submit" value="上传"/>
</form>
提交到mnt/fileupload指向的负责文件上传的servlet
发现居然用String filetitle=request.getParameter("ftitle").toString() 居然不能获取那个表单里面input type为text,名为ftitle的值。
甚是苦恼。
解决方法:
原因:form是用multipart/form-data提交的 就是多种类型的文件
所以呢request.getParameter是获取不了这种表单里面的任何值的
可以通过如下的方法解决
1.将传递过来的form表单数据 用一个 FileItem的List容器来储存
ServletFileUpload sfu = new ServletFileUpload(factory); //文件上传组件
List<FileItem> items = sfu.parseRequest(req);//获取表单传过来的所有类型的东西,包括文件和其他数据值
2.遍历这个List容器,然后分辨那些是文件类型,那些是数据值类型
在FileItem 类中 有一个方法叫做isFormField();
isFormField为true,表示这不是文件上传表单域,即他是数据字段 可以用toString来获取转化的值
如果为false,表示为文件类型,后面写文件上传功能实现代码。
3.如果他是数据类型,要怎么取值呢
for (int i = 0; i < items.size(); i++) {
FileItem item = items.get(i);
// isFormField为true,表示这不是文件上传表单域
if (item.isFormField()) {
String fieldname = item.getFieldName();
if (fieldname.equals("ftitle")) {
filetitle = item.getString("UTF-8");
System.out.println(filetitle);
}
}
通过getFileName()获取表单的 input 的name类型
如果name类型与要取的类型匹配,则对这个元素 进行getString(字符编码) 方法取值。