文件的上传推荐使用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. 1 <form action="uploadServlet" method="post" enctype="multipart/form-data">
  2. 2 <table>
  3. 3 <tr>
  4. 4 <td>File</td>
  5. 5 <td><input type="file" name="file1"></td>
  6. 6 </tr>
  7. 7
  8. 8 <tr>
  9. 9 <td>Username</td>
  10. 10 <td><input type="text" name="username"></td>
  11. 11 </tr>
  12. 12
  13. 13 <tr>
  14. 14 <td>Gender</td>
  15. 15 <td>
  16. 16 <input type="radio" name="gender" value="M">Male
  17. 17 <input type="radio" name="gender" value="F">Female
  18. 18 </td>
  19. 19 </tr>
  20. 20
  21. 21 <tr>
  22. 22 <td>Colours</td>
  23. 23 <td>
  24. 24 <input type="checkbox" name="colours" value="red">Red
  25. 25 <input type="checkbox" name="colours" value="green">Green
  26. 26 <input type="checkbox" name="colours" value="blue">Blue
  27. 27 <input type="checkbox" name="colours" value="white">White
  28. 28 <input type="checkbox" name="colours" value="black">Black
  29. 29 </td>
  30. 30 </tr>
  31. 31
  32. 32 <tr style="height: 15px"></tr>
  33. 33
  34. 34 <tr>
  35. 35 <td colspan="2"><input type="submit" value="submit"></td>
  36. 36 </tr>
  37. 37 </table>
  38. 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. 1 @WebServlet("/uploadServlet")
  2. 2 public class UploadServlet extends HttpServlet {
  3. 3
  4. 4 private static final long serialVersionUID = 1L;
  5. 5
  6. 6 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  7. 7
  8. 8 // 获取DiskFileItemFactory的实例factory
  9. 9 DiskFileItemFactory factory = new DiskFileItemFactory();
  10. 10
  11. 11 // sizeThreshold(int)参数用来设置上传的文件的大小的阈值(单位:字节)
  12. 12 // repository(File)参数用来指定一个硬盘上的临时路径
  13. 13 // 如果文件大小没有超过阈值,则将文件保存在内存中;
  14. 14 // 如果文件大小超过了阈值,则将文件保存在repository参数指定的路径中
  15. 15 int sizeThreshold = 1024 * 5; //5KB
  16. 16
  17. 17 File repository = new File("D:" + File.separator + "tempRepository");
  18. 18 if (!repository.exists()) {
  19. 19 repository.mkdir();
  20. 20 }
  21. 21
  22. 22 // 设置sizeThreshold和repository参数(也可以在构造器中配置)
  23. 23 factory.setSizeThreshold(sizeThreshold);
  24. 24 factory.setRepository(repository);
  25. 25
  26. 26 // 获取ServletFileUpload的实例uploadHandler
  27. 27 ServletFileUpload uploadHandler = new ServletFileUpload();
  28. 28
  29. 29 // 设置fileItemFactory参数(也可以在构造器中配置)
  30. 30 uploadHandler.setFileItemFactory(factory);
  31. 31
  32. 32 // fileSizeMax参数用来设置上传的单个文件的大小的阈值
  33. 33 // sizeMax参数用来设置上传的总的文件的大小的阈值
  34. 34 long fileSizeMax = 1024 * 1024 * 5; //5MB
  35. 35 long sizeMax = 1024 * 1024 * 40; //40MB
  36. 36
  37. 37 // 设置fileSizeMax和sizeMax参数
  38. 38 uploadHandler.setFileSizeMax(fileSizeMax);
  39. 39 uploadHandler.setSizeMax(sizeMax);
  40. 40
  41. 41 try {
  42. 42
  43. 43 // 调用uploadHandler的parseRequest()方法,传入request作为参数,得到一个FileItem类型的集合
  44. 44 // 该集合中的每一个FileItem实例对应前端页面中的每一个表单标签
  45. 45 List<FileItem> fileItems = uploadHandler.parseRequest(request);
  46. 46
  47. 47 // 遍历该集合,以得到每一个表单标签所提交的值
  48. 48 for (FileItem fileItem : fileItems) {
  49. 49 if (fileItem.isFormField()) {
  50. 50 System.out.println(fileItem.getFieldName() + ": " + fileItem.getString("UTF-8"));
  51. 51 } else {
  52. 52 System.out.println(fileItem.getFieldName() + ": " + fileItem.getName());
  53. 53 }
  54. 54 }
  55. 55 } catch (Exception e) {
  56. 56 e.printStackTrace();
  57. 57 }
  58. 58 }
  59. 59
  60. 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. docker第一日学习总结

    查看当前所有的镜像 docker images 查看当前运行的容器 docker ps 一般容器分为后台驻留和闪退(ubuntu\busybox等)两种,对于后台驻留的,我们如果想进入这个容器(前提是 ...

  2. Pytest(17)运行未提交的git(pytest-picked)

    前言 我们每天写完自动化用例后都会提交到 git 仓库,随着用例的增多,为了保证仓库代码的干净,当有用例新增的时候,我们希望只运行新增的未提交 git 仓库的用例.pytest-picked 插件可以 ...

  3. Centos根目录100%解决思路

    Centos 7 根目录(爆满)100%解决思路,下面以宝塔面板环境为例 1.首先远程到服务器,在~下输入df -h ,看下根目录下文件夹使用情况 [root@localhost~]# df -h F ...

  4. 2019牛客暑期多校训练营(第五场)H.subsequence 2(拓扑)

    题意:给你一个字符串的长度n 现在询问了m*(m-1)/2次 每次都可以询问两个字符 然后 会告诉你只留下这两个字符后 字符串的样子 现在问你能不能还原字符串 如果能就输出字符串 否则输出-1 思路: ...

  5. POJ - 3693 Maximum repetition substring(重复次数最多的连续重复子串)

    传送门:POJ - 3693   题意:给你一个字符串,求重复次数最多的连续重复子串,如果有一样的,取字典序小的字符串. 题解: 比较容易理解的部分就是枚举长度为L,然后看长度为L的字符串最多连续出现 ...

  6. HDU6532 Chessboard (最大费用流)

    题意:棋盘上有n个棋子 每个棋子都有收益 现在给定1e5条线 有横着的 竖着的 规定只能在线的一侧选最多ki个棋子 问最大收益 题解:写自闭的一道题 很容易想到是网络流 但是建图有点难 第一道最大费用 ...

  7. 2019牛客暑期多校训练营(第六场)J Upgrading Technology

    传送门 题意: 就是给你n个技能,每个技能最高升到m级,每升一级就是耗费Cij钱,这个Cij可能是负的,如果所有技能都升到或者说超过j等级,就会获得Dj钱,这个Dj也有可能是负值,让你求你最多得到多少 ...

  8. HihoCoder - 1110

    题意: 您的任务是判断输入是否是合法的正则表达式.正则表达式定义如下: 1: 0和1都是正则表达式. 2:如果P和Q是正则表达式,那么PQ就是正则表达式. 3:如果P是正则表达式,(P)就是正则表达式 ...

  9. Gym 101174D Dinner Bet(概率DP)题解

    题意:n个球,两个人每人选C个球作为目标,然后放回.每回合有放回的拿出D个球,如果有目标球,就实现了这个目标,直到至少一个人实现了所有目标游戏结束.问结束回合的期望.误差1e-3以内. 思路:概率DP ...

  10. 常用SQL语句1-增删改查

    一.名词解释 RDBMS 即关系数据库管理系统(Relational Database Management System)的特点: 1.数据以表格的形式出现 2.每行为各种记录名称 3.每列为记录名 ...