首页 > 编程语言 > 详细

小白养成记——JavaWeb之文件的上传

时间:2020-02-05 22:18:26      阅读:67      评论:0      收藏:0      [点我收藏+]

 文件的上传推荐使用commons的fileupload组件来完成。该组件还依赖于io包,因此需要用到两个jar包:

  • commons-fileupload-X.X.jar
  • commons-io-X.X.jar

  这两个jar包可以在Apache Commons的网站中下载 http://commons.apache.org/

一、表单的准备

  与无文件时的表单不同,如果需要提交的表单中含有文件,则需要注意以下两点

  1. 请求方式一定是POST,同时需要更改默认编码方式为"multipart/form-data"
  2. 使用一个类型为"file"的表单标签来提示插入文件

  示例如下

  技术分享图片
 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>
含文件标签的表单示例(jsp)

  页面效果为

技术分享图片

 

二、 使用commons-fileupload组件获取表单数据

  在UploadServlet中使用commons-fileupload组件读取表单数据的步骤如下

  1. 创建DiskFileItemFactory的实例factory,用于获取ServletFileUpload
    1. factory需要指定两个参数:sizeThreshold(int)和repository(File),分别用于指定单个文件大小的阈值和一个本地临时路径
    2. 这两个参数可以在构造器中传入,也可以在得到factory后使用setter方法来设置
  2. 利用已经创建好的factory,创建ServletFileUpload实例uploadHandler,用于获取FileItem调用uploadHandler的parseRequest(Request request)方法,得到FileItem组成的集合fileItems
    1. 创建ServletFileUpload实例需要一个FileItemFactory实例,这个实例可以在构造器中传入,也可以使用setter方法来设置
    2. uploadHandler可以指定两个参数:fileSizeMax和sizeMax,分别表示上传的单个文件大小的阈值和总的文件大小的阈值,如果超过阈值则会抛出异常
  3. 每一个FileItem对应前端表单的每一个表单标签,遍历上述集合,获取每一个表单标签提交的值
    1. 获取表单数据时,不能再使用request.getParameter(String name)方法,而要使用fileItem的相关方法
    2. 对于非文件数据,表单标签中的name属性值可以使用fileItem.getFieldName()方法来获取,value属性值可以使用fileItem.getString("UTF-8")方法来获取
    3. 对于文件数据,表单标签中的name属性值同样使用fileItem.getFieldName()方法来获取。至于文件名,可以使用fileItem.getName()方法来获取;文件的内容可以通过fileItem.getOutputStream()方法得到一个文件对应的输出流,也可以使用fileItem.write(File file)方法来将文件内容写入到参数file指定的文件中

  完整的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 }
UploadServlet.java

  

  在浏览器端输入以下数据

技术分享图片

  提交后,则可以在服务器端获得以下结果

技术分享图片

三、FileItem的常用方法

  • 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():  获取上传的文件的类型,如

    • "text/plain",文本文件.txt
    • "image/jpeg",图片.jpg
    • "audio/mp3",音乐.mp3
    • "audio/x-flac",音乐.flac
    • "video/mp4",视频.mp4
    • application/pdf,文件.pdf
    • "application/x-zip-compressed",文件.apk(zip/rar)
    • "application/x-msdownload",可执行文件.exe
    • "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
    • "application/vnd.openxmlformats-officedocument.wordprocessingml.document",

    等,文件后缀名与contentType的对照表可以参见(https://tool.oschina.net/commons/)。如果上传的是一个普通的文本表单域,则只能获取到null。(该方法一般只用于文件表单标签)

小白养成记——JavaWeb之文件的上传

原文:https://www.cnblogs.com/ideal160830/p/12261912.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!