这两个jar包可以在Apache Commons的网站中下载 http://commons.apache.org/
与无文件时的表单不同,如果需要提交的表单中含有文件,则需要注意以下两点
示例如下
1 <form action="uploadServlet" method="post" enctype="multipart/form-data"> 2 <table> 3 <tr> 4 <td>File</td> 5 <td><input type="file" name="file1"></td> 6 </tr> 7 8 <tr> 9 <td>Username</td> 10 <td><input type="text" name="username"></td> 11 </tr> 12 13 <tr> 14 <td>Gender</td> 15 <td> 16 <input type="radio" name="gender" value="M">Male 17 <input type="radio" name="gender" value="F">Female 18 </td> 19 </tr> 20 21 <tr> 22 <td>Colours</td> 23 <td> 24 <input type="checkbox" name="colours" value="red">Red 25 <input type="checkbox" name="colours" value="green">Green 26 <input type="checkbox" name="colours" value="blue">Blue 27 <input type="checkbox" name="colours" value="white">White 28 <input type="checkbox" name="colours" value="black">Black 29 </td> 30 </tr> 31 32 <tr style="height: 15px"></tr> 33 34 <tr> 35 <td colspan="2"><input type="submit" value="submit"></td> 36 </tr> 37 </table> 38 </form>
页面效果为
在UploadServlet中使用commons-fileupload组件读取表单数据的步骤如下
完整的UploadServlet.java源码示例如下
1 @WebServlet("/uploadServlet") 2 public class UploadServlet extends HttpServlet { 3 4 private static final long serialVersionUID = 1L; 5 6 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 7 8 // 获取DiskFileItemFactory的实例factory 9 DiskFileItemFactory factory = new DiskFileItemFactory(); 10 11 // sizeThreshold(int)参数用来设置上传的文件的大小的阈值(单位:字节) 12 // repository(File)参数用来指定一个硬盘上的临时路径 13 // 如果文件大小没有超过阈值,则将文件保存在内存中; 14 // 如果文件大小超过了阈值,则将文件保存在repository参数指定的路径中 15 int sizeThreshold = 1024 * 5; //5KB 16 17 File repository = new File("D:" + File.separator + "tempRepository"); 18 if (!repository.exists()) { 19 repository.mkdir(); 20 } 21 22 // 设置sizeThreshold和repository参数(也可以在构造器中配置) 23 factory.setSizeThreshold(sizeThreshold); 24 factory.setRepository(repository); 25 26 // 获取ServletFileUpload的实例uploadHandler 27 ServletFileUpload uploadHandler = new ServletFileUpload(); 28 29 // 设置fileItemFactory参数(也可以在构造器中配置) 30 uploadHandler.setFileItemFactory(factory); 31 32 // fileSizeMax参数用来设置上传的单个文件的大小的阈值 33 // sizeMax参数用来设置上传的总的文件的大小的阈值 34 long fileSizeMax = 1024 * 1024 * 5; //5MB 35 long sizeMax = 1024 * 1024 * 40; //40MB 36 37 // 设置fileSizeMax和sizeMax参数 38 uploadHandler.setFileSizeMax(fileSizeMax); 39 uploadHandler.setSizeMax(sizeMax); 40 41 try { 42 43 // 调用uploadHandler的parseRequest()方法,传入request作为参数,得到一个FileItem类型的集合 44 // 该集合中的每一个FileItem实例对应前端页面中的每一个表单标签 45 List<FileItem> fileItems = uploadHandler.parseRequest(request); 46 47 // 遍历该集合,以得到每一个表单标签所提交的值 48 for (FileItem fileItem : fileItems) { 49 if (fileItem.isFormField()) { 50 System.out.println(fileItem.getFieldName() + ": " + fileItem.getString("UTF-8")); 51 } else { 52 System.out.println(fileItem.getFieldName() + ": " + fileItem.getName()); 53 } 54 } 55 } catch (Exception e) { 56 e.printStackTrace(); 57 } 58 } 59 60 }
在浏览器端输入以下数据
提交后,则可以在服务器端获得以下结果
boolean isFormField(): 判断FileItem对象里面封装的数据是一个普通文本表单域,还是一个文件表单域。如果是普通的文本则返回true,如果是文件则返回false
String getFieldName(): 获取表单标签的name属性值
String getString(String characterEncoding): 获取数据流文件对应的字符串,即表单标签的value属性值。可以传入一个编码方式作为参数,如getString(“UTF-8”)。(该方法一般只用于获取非文件的表单内容)
void write(File file): 将FileItem对象中的内容保存到某个指定的文件中(可以是文件也可以是普通文本框中的内容)。如果FileItem对象中的内容保存在某个临时文件中,该方法结束后,临时文件会删除。(该方法一般只用于文件表单标签)
String getName(): 获取上传的文件的文件名(含本地绝对路径名以以及扩展名,形如C:\Users\ideal\Desktop\study.txt)。如果上传的是一个普通的文本表单域,则只能获取到null。(该方法一般只用于文件表单标签)
InputStream getInputStrean(): 获取上传的文件或文本框内容的输入流。(该方法一般只用于文件表单标签)
long getSize(): 获取上传的文件的大小(单位:字节)。如果是普通的文本表单域,则统计字节的大小(一个汉字或平假名=3字节)。
String getContenType(): 获取上传的文件的类型,如
等,文件后缀名与contentType的对照表可以参见(https://tool.oschina.net/commons/)。如果上传的是一个普通的文本表单域,则只能获取到null。(该方法一般只用于文件表单标签)
原文:https://www.cnblogs.com/ideal160830/p/12261912.html