文件的上传推荐使用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. 嵌入式设备上卷积神经网络推理时memory的优化

    以前的神经网络几乎都是部署在云端(服务器上),设备端采集到数据通过网络发送给服务器做inference(推理),结果再通过网络返回给设备端.如今越来越多的神经网络部署在嵌入式设备端上,即inferen ...

  2. UVA 10480 Sabotage (最大流最小割)

    题目链接:点击打开链接 题意:把一个图分成两部分,要把点1和点2分开.隔断每条边都有一个花费,求最小花费的情况下,应该切断那些边. 这题很明显是最小割,也就是最大流.把1当成源点,2当成汇点. 问题是 ...

  3. 【uva 1152】4 Values Whose Sum is Zero(算法效率--中途相遇法+Hash或STL库)

    题意:给定4个N元素几个A,B,C,D,要求分别从中选取一个元素a,b,c,d使得a+b+c+d=0.问有多少种选法.(N≤4000,D≤2^28) 解法:首先我们从最直接最暴力的方法开始思考:四重循 ...

  4. P1020 导弹拦截(LIS)

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  5. PowerShell启用多跳远程控制

    有些场景下,我们使用远程连接了某个Server,在远程Server中再想进行远程操作,就会提示错误.因为默认的认证信息只会传递一跳. 对此,微软官方文档给出的解决方案是:https://docs.mi ...

  6. SPU与SKU概念

    1. 什么是SPU SPU 是商品信息聚合的最小单位,是一组可复用.易检索的标准化信息的集合,该集合描述了一个产品的特性.即:某一款商铺的公共属性. 通俗点讲,属性值.特性相同的货品就可以称为一个 S ...

  7. 【原创】k8s之job和Cronjob

    1.失败任务 apiVersion: batch/v1 kind: Job metadata: name: bad spec: template: metadata: name: bad spec: ...

  8. Automatic merge failed; fix conflicts and then commit the result.解决方法

    产生原因: git pull 的时候会分为两步,第一步先从远程服务器上拉下代码,第二步进行merge.当你merge时候失败了就会产生Automatic merge failed; fix confl ...

  9. codevs1154能量项链 环形区间DP 细节

    中文题..题意略 我们知道每次枚举最后合并哪两个.. 于是枚举中间节点k 我犯的错误是将转移方程写成了,dp[l][r]=max(dp[l][r],dp[l][k]+dp[k+1][r]+a[l]*a ...

  10. 记一次 Raven2 渗透(phpmailer漏洞+UDF提权)

    目录: 1. 寻找IP 2.dirb目录爆破 2.PHPMailer漏洞反弹得到shell 3.python版本的exp修改 4.查看wordpress的wp-config.php配置文件得到数据库账 ...