文件的上传推荐使用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之文件的上传的更多相关文章

  1. JavaWeb中文件的上传和下载

    JavaWeb中文件的上传和下载 转自: JavaWeb学习总结(五十)——文件上传和下载 - 孤傲苍狼 - 博客园https://www.cnblogs.com/xdp-gacl/p/4200090 ...

  2. Javaweb之文件的上传与下载

    Javaweb之文件的上传与下载 一.基于表单的文件上传 如果在表单中使用表单元素 <input type=“file” />,浏览器在解析表单时,会自动生成一个输入框和一个按钮,输入框可 ...

  3. JavaWeb 之文件的上传下载

    又到了每周更新博客的时候了,每看到自己发布的随笔阅读量上涨的时候就特别开心,我也会尽自己的努力提高自己的水平,总结出通俗易读的学习笔记,还望大家能多多支持!!! ------------------- ...

  4. JAVAWEB之文件的上传下载

    文件上传下载 文件上传: 本篇文章使用的文件上传的例子使用的都是原生技术,servelt+jdbc+fileupload插件,这也是笔者的习惯,当接触到某些从未接触过的东西时,总是喜欢用最原始的东西将 ...

  5. javaWEB 之文件的上传

    1.1 文件上传三要素 提供form表单,method必须是post form表单的enctype必须是multipart/form-data 提供 input type=“file” 类型输入 1. ...

  6. JAVAWEB之文件的上传和下载

    一.文件的上传: Enctype的属性介绍: 基于表单文件上传的界面简介: 文件上传时服务器端获取不到请求信息的原因及获取请求信息的几种方式: 输入流方式的实现: 实用工具包的实现:要导入fileup ...

  7. 【JAVAWEB学习笔记】29_文件的上传------commons-fileupload

    今天内容: 文件的上传------commons-fileupload 文件上传和下载的实质:文件的拷贝 文件上传:从本地拷贝到服务器磁盘上   客户端需要编写文件上传表单---->服务端需要编 ...

  8. JavaWeb框架_Struts2_(七)----->文件的上传和下载

    这个章节是Struts2框架应用最广泛的三个版块(上传下载.国际化.校验输入)之一,所以这一版块的学习还蛮重要的. 1. 章节目录 Struts2文件上传 单文件上传 拦截器实现文件过滤 文件上传常量 ...

  9. asp.net 文件分片上传

    最近在研究文件上传,里面的门道还是挺多的,网上大多数文章比较杂乱,代码都是片段,对于新手小白来说难度较高,所以在此详细写一下今天看到的一个demo,关于文件分片上传的. <!DOCTYPE ht ...

随机推荐

  1. A - A Supermarket (贪心, 并查集)

    超市里有n个产品要卖,每个产品都有一个截至时间dx(从开始卖时算起),只有在这个截至时间之前才能卖出并且获得率润dy. 有多个产品,所有可以有不同的卖出顺序,每卖一个产品要占用1个单位的时间,问最多能 ...

  2. Codeforces Round #574 (Div. 2) E.OpenStreetMap

    题目链接 题目的意思就是给你一个矩阵你要求给定子矩阵的最小值的和 单调队列扫两边即可 #include <bits/stdc++.h> #define ll long long #defi ...

  3. 2020牛客暑期多校训练营(第二场) Boundary

    传送门:Boundary  题意:给你n个点的坐标,问最多有多少个点可以在同一个圆上,(0,0)必须在这个圆上. 题解:三个点确定一个圆,所以暴力枚举两个点和(0,0)组成的圆,如果三个点不共线的话, ...

  4. B、小花梨的三角形(解题报告)

    通过set进行标记(思想很简单,实现起来有点容易错)set(红黑树:效率高) 思路: 对行列和长度进行枚举: 对三个顶点进行排序 储存顶点后计数输出 #include<iostream> ...

  5. 南阳ccpc C题 The Battle of Chibi && hdu5542 The Battle of Chibi (树状数组优化+dp)

    题意: 给你一个长度为n的数组,你需要从中找一个长度为m的严格上升子序列 问你最多能找到多少个 题解: 我们先对原序列从小到大排序,排序之后的序列就是一个上升序列 这里如果两个数相等的话,那么因为题目 ...

  6. hdu2196 Compute

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

  7. Codeforces #Round 632 div2 A~C

                                       A. Little Artem   Young boy Artem tries to paint a picture, and h ...

  8. C# 替换文件名的字符

    https://www.cnblogs.com/lindexi/p/8970466.html

  9. CF1400-C. Binary String Reconstruction

    CF1400-C. Binary String Reconstruction 题意: 对于一个二进制字符串\(s\),以及一个给定的\(x\),你可以通过一下操作来得到字符串\(w\): 对于字符串\ ...

  10. 流媒体传输协议之 RTP (上篇)

    本系列文章将整理各个流媒体传输协议,包括 RTP/RTCP,RTMP,希望通过深入梳理协议的设计细节,能够给流媒体领域的开发者带来一定的启发. 作者:逸殊 审核:泰一 介绍 RTP,即 real-ti ...