文件的上传推荐使用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. Flink-v1.12官方网站翻译-P012-Stateful Stream Processing

    有状态的流处理 什么是状态? 虽然数据流中的许多操作一次只看一个单独的事件(例如事件解析器),但有些操作会记住多个事件的信息(例如窗口操作符).这些操作被称为有状态操作.一些有状态操作的例子. - 当 ...

  2. 从零开始教你安装Oracle数据库

    1.数据库安装 1.1下载 根据自己的操作系统位数,到oracle官网下载(以oracle 11g 为例) 之后把两个压缩包解压到同一个文件夹内(需要注意的是,这个文件夹路径名称中最好不要出现中文.空 ...

  3. hdu 2072 单词数(字符串)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2072 题意 每行输入由小写字母和空格组成,统计每行中不同的单词数. 题解 题解一 比较简洁的解法,读入 ...

  4. Codeforces Round #479 (Div. 3) F. Consecutive Subsequence (DP)

    题意:给你一个长度为\(n\)的序列,求一个最长的\({x,x+1,x+2,.....,x+k-1}\)的序列,输出它的长度以及每个数在原序列的位置. 题解:因为这题有个限定条件,最长序列是公差为\( ...

  5. Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence (思维,模拟栈)

    题意:给你一串括号,每次仅可以修改一个位置,问有多少位置仅修改一次后所有括号合法. 题解:我们用栈来将这串括号进行匹配,每成功匹配一对就将它们消去,因为题目要求仅修改一处使得所有括号合法,所以栈中最后 ...

  6. Python_微信支付(云开发)

    一.创建云开发小程序 1.初始化云开发环境 //app.js App({ onLaunch: function () { wx.cloud.init({ //初始化云开发环境 env: 'wxypay ...

  7. HDU 4511 小明系列故事——女友的考验 (AC自动机 + DP)题解

    题意:从 1 走到 n,要求所走路径不能出现给定的路径,求最短路 思路:因为要求不能出现给定路径,那么我可以求助ac自动机完成判断. 我们可以在build的时候标记哪些路径不能出现,显然下面这种表示后 ...

  8. [转]论基于DSSA的软件架构设计与应用

    [摘要]   去年三月份,我所在的公司启动国网电力用户用电信息采集系统项目,我被任命为项目负责人.国网电力用户用电信息采集系统是国家电网公司坚强智能电网建设的一部分.由于公司之前为南网(主要是广东省) ...

  9. element-ui & babel-plugin-component config bug

    element-ui & babel-plugin-component config bug vue-cli bad babel.config.js module.exports = { pr ...

  10. JavaScript Inheritance All in One

    JavaScript Inheritance All in One constructor inheritance prototype chain inheritance "use stri ...