其中涉及到的jar包

jsp显示层:

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  3. <html>
  4. <head>
  5. <title>文件上传</title>
  6. </head>
  7. <body>
  8. <form action="${pageContext.servletContext.contextPath }/servlet/UpLoadDemo03" method="POST" enctype="multipart/form-data">
  9. 请选择要上传的文件一:<input type="file" name="attachment01" /><br/>
  10. 请选择要上传的文件二:<input type="file" name="attachment02" /><br/>
  11. 请选择要上传的文件三:<input type="file" name="attachment03" /><br/>
  12. <input type="submit" value="上传文件"/>
  13. </form>
  14. </body>
  15. </html>

成功后跳转的显示文件信息的界面:

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  4. <html>
  5. <head>
  6. <title>success</title>
  7. </head>
  8. <body>
  9. <h3>文件上传成功! </h3>
  10. <table border="1" width="500px">
  11. <tr>
  12. <th>编号</th>
  13. <th>文件名</th>
  14. <th>大小</th>
  15. <th>类型</th>
  16. <th>上传时间</th>
  17. </tr>
  18. <c:forEach items="${fileList}" var="bean" varStatus="varSta">
  19. <tr>
  20. <td>${varSta.count }</td>
  21. <td>${bean.name }</td>
  22. <td>${bean.size }</td>
  23. <td>${bean.type }</td>
  24. <td>${bean.addTime }</td>
  25. </tr>
  26. </c:forEach>
  27. </table>
  28. </body>
  29. </html>

其中封装的文件信息的JavaBean:

  1. package entity;
  2. public class FileBean {
  3. private String name; // 文件名称
  4. private String size; // 大小
  5. private String type; // 类型
  6. private String addTime; // 上传时间
  7. public String getName() {
  8. return name;
  9. }
  10. public void setName(String name) {
  11. this.name = name;
  12. }
  13. public String getSize() {
  14. return size;
  15. }
  16. public void setSize(String size) {
  17. this.size = size;
  18. }
  19. public String getType() {
  20. return type;
  21. }
  22. public void setType(String type) {
  23. this.type = type;
  24. }
  25. public String getAddTime() {
  26. return addTime;
  27. }
  28. public void setAddTime(String addTime) {
  29. this.addTime = addTime;
  30. }
  31. }

servlet逻辑层代码:

  1. package upload;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.text.DecimalFormat;
  6. import java.text.SimpleDateFormat;
  7. import java.util.ArrayList;
  8. import java.util.Date;
  9. import java.util.List;
  10. import javax.servlet.ServletException;
  11. import javax.servlet.http.HttpServlet;
  12. import javax.servlet.http.HttpServletRequest;
  13. import javax.servlet.http.HttpServletResponse;
  14. import org.apache.commons.fileupload.FileItem;
  15. import org.apache.commons.fileupload.disk.DiskFileItemFactory;
  16. import org.apache.commons.fileupload.servlet.ServletFileUpload;
  17. import org.apache.commons.io.FileUtils;
  18. import entity.FileBean;
  19. /**
  20. * 多文件上传!
  21. *
  22. * 使用apache的文件上传和下载的组件
  23. * 1.导入jar包
  24. * commons-fileload-1.2.2.jar
  25. * commons-io-2.1.jar 一个IO流工具(更方便)
  26. * @author mzy
  27. *
  28. */
  29. public class UpLoadDemo03 extends HttpServlet {
  30. private static final long serialVersionUID = 987003232758385500L;
  31. public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  32. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  33. DecimalFormat df = new DecimalFormat("#.00");
  34. try {
  35. DiskFileItemFactory factory = new DiskFileItemFactory(10*1024, new File("e:/temp"));
  36. ServletFileUpload upload = new ServletFileUpload(factory);
  37. /* 3.解析文件
  38. * 该方法会自动读取请求的实体内容中所有上传文件的信息。
  39. * List:可以是多个文件
  40. *
  41. * 其中解析request中的文件的个数:
  42. * 需要注意的是,并不一定是用户实际上传的文件数量
  43. * 如果我jsp中有三个input标签,但是用户只上传了两个,就
  44. * submit了;但是在实际解析request的时候,还是解析的三
  45. * 个文件,因为解析的文件个数是由input标签的个数决定的!
  46. * 所以在这种情况下,三个input只使用了两个的话,就会报错!
  47. * 可能要通过异常处理,自定义此异常在实际运用中解决!
  48. *
  49. * 其次:
  50. * 注意jsp中进行文件传递的input标签(type="file")
  51. * 必须要有name属性,因为在源码构造的时候,需要传入
  52. * name属性进行文件解析(虽然我们使用不到name属性)
  53. *
  54. * 然后:
  55. * 文件名相同情况,不能解决,如果上传的文件相同直接
  56. * 覆盖掉了!
  57. * 可能首先要对目录下的file文件进行名字判断isEixt?
  58. */
  59. List<FileItem> list = upload.parseRequest(request);
  60. /*
  61. * 我们将每个文件的基本信息存放到我们构建的文件的javaBean对象中去!
  62. * 最后上传成功之后,显示到表现层!
  63. */
  64. List<FileBean> fileList = new ArrayList<FileBean>();
  65. /*
  66. * 设置文件头编码,来解决某些服务端默认编码造成的中文乱码问题!
  67. */
  68. upload.setHeaderEncoding("utf-8");
  69. // 将上传的文件的信息读取出来
  70. for (FileItem item : list) {
  71. String name = item.getName();
  72. if(name.contains("\\")) {
  73. name = name.substring(name.lastIndexOf("\\")+1, name.length());
  74. }
  75. // 文件大小:单位应该是KB
  76. long size = item.getSize();
  77. // 类型
  78. String contentType = item.getContentType();
  79. /*
  80. * 对文件的大小单位做转化:
  81. * 1024B = 1KB
  82. * 1024*1024B = 1MB
  83. * 1024*1024*1024B = 1GB
  84. */
  85. String sizeString;
  86. double tempSize;
  87. if(size >= 1024 && size < 1024 * 1024) {
  88. tempSize = size/1024.0;
  89. sizeString = df.format(tempSize)+"KB";
  90. } else if(size > 1024 * 1024 &&
  91. size <= 1024 * 1024 * 1024) {
  92. tempSize = size/(1024*1024.0);
  93. sizeString = df.format(tempSize)+"MB";
  94. } else if(size >= 1024 * 1024 * 1024) {
  95. tempSize = size/(1024*1024*1024.0);
  96. sizeString = df.format(tempSize)+"GB";
  97. } else {
  98. sizeString = size+"B";
  99. }
  100. // 封装FileBean对象
  101. FileBean bean = new FileBean();
  102. bean.setName(name);
  103. bean.setType(contentType);
  104. bean.setSize(sizeString);
  105. bean.setAddTime(sdf.format(new Date()));
  106. // 将bean对象放入到fileList中去!
  107. fileList.add(bean);
  108. // 文件内容
  109. InputStream in = item.getInputStream();
  110. FileUtils.copyInputStreamToFile(in, new File("e:/files/"+name));
  111. /*
  112. * 注意:
  113. * 在我文件上传完成之后,本地的临时文件
  114. * 不会自动删除,所以要我们手动的进行删除!
  115. */
  116. item.delete();
  117. }
  118. request.setAttribute("fileList", fileList);
  119. /*
  120. * 请求转发是浏览器行为:
  121. * success.jsp界面直接位于webRoot根目录下
  122. */
  123. request.getRequestDispatcher("/03.upload_success.jsp").forward(request, response);
  124. } catch (Exception e) {
  125. e.printStackTrace();
  126. // throw new RuntimeException(e.getMessage());
  127. }
  128. }
  129. public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  130. request.setCharacterEncoding("utf-8");
  131. response.setContentType("text/html;charset=utf-8");
  132. doGet(request, response);
  133. }
  134. }

其中提到的多个input,有传空值的情况下,前端约束案例

模拟文件上传(三):使用apache fileupload组件进行文件批量上传的更多相关文章

  1. 模拟文件上传(二):使用apache fileupload组件进行文件上传

    其中涉及到的jar包: jsp显示层: <%@ page language="java" import="java.util.*" pageEncodin ...

  2. 使用 fileupload 组件完成文件的上传应用

    1. 使用 fileupload 组件完成文件的上传应用 commons-dbutils-1.3.jarcommons-fileupload-1.2.1.jar 1). 需求: > 在 uplo ...

  3. java采用Apache FileUpload组件实现上传

    可见:FileItemSteam(servletFileUpload.getItemIterator(httpServletRequest))速度要快于FileItem(servletFileUplo ...

  4. .JavaWeb文件上传和FileUpload组件使用

    .JavaWeb文件上传 1.自定义上传 文件上传时的表单设计要符合文件提交的方式: 1.提交方式:post 2.表单中有文件上传的表单项:<input type="file" ...

  5. Ajax文件上传三式

    文件上传(三式) 1.urls.py文件 url(r'^upload.html$', views.upload), 2.views.py文件 import os def upload(request) ...

  6. 利用uploadify+asp.net 实现大文件批量上传。

    前言 现在网上文件上传组件随便一搜都是一大堆,不过看大家一般都在用uploadify这个来上传文件.由于项目需要,我在来试了一下.因为第一次使用,也遇到了很多问题,特此记录! ------------ ...

  7. jquery文件批量上传控件Uploadify3.2(java springMVC)

    人比較懒  有用为主 不怎么排版了 先放上Uploadify的官网链接:http://www.uploadify.com/  -->里面能够看到PHP的演示样例,属性说明,以及控件下载地址.分f ...

  8. Apache FileUpload详细介绍

    Apache FileUpload组件 在最初的 http 协议中,没有上传文件方面的功能.RFC1867("Form-based File Upload in HTML".)为 ...

  9. asp.net+swfupload 多图片批量上传(附源码下载)

    asp.net的文件上传都是单个文件上传方式,无法执行一次性多张图片批量上传操作,要实现多图片批量上传需要借助于flash,通过flash选取多个图片(文件),然后再通过后端服务进行上传操作. 本次教 ...

随机推荐

  1. 记录Jackson和Lombok的坑

    记录Jackson和Lombok的坑 今天遇到Jackson反序列化json缺少了字段,后来研究下发现是Jackson的机制和Lombok生成的setter不一致,导致没有正确调用setter. 复现 ...

  2. React组件三大属性之 refs

    React组件三大属性之 refs refs属性 1) 组件内的标签都可以定义ref属性来标识自己 a. <input type="text" ref={input => ...

  3. 在windows中安装PHP MongoDB扩展

    最近做的一个项目中涉及到,ThinkPHP框架,MongoDB数据库,在本地windows 7 64位系统下,xamppv3.2.2集成的php环境运行测试程序.在网上百度后,按说明配置成功,现将步骤 ...

  4. Spring Boot的MyBatis注解:@MapperScan和@Mapper(十七)

    1.Spring Boot与MyBatis融合的矛盾问题: Spring家族的使命就是为了简化而生,但是随着Spring的发展壮大,有点事与愿违了.为了坚持初心,Spring家族祭出了一大杀器---S ...

  5. MySQL架构及优化原理

    1 MySQL架构原理 1.1 MySQL架构原理参看下述链接: https://blog.csdn.net/hguisu/article/details/7106342 1.2 MySQL优化详解参 ...

  6. vue知识点----element UI+vue关于日期范围选择的操作,picker-options属性的使用

    需求场景如下: 指定起止日期,后选的将会受到先选的限制 不同的日期选择器,不过也存在关联关系 实现方法不难,利用了 change 事件,动态改变 picker-options 中的 disableDa ...

  7. jstack 命令使用经验总结

    jstack 命令的基本使用 jstack 在命令使用上十分简洁, 其信息量与复杂度主要体如今 thread dump 内容的分析上;web # 最基本的使用sudo -u xxx jstack {v ...

  8. mongoose基础使用

    mongoose与mongodb 首先,要明确mongoose和mongodb是什么? mongodb是一种文档数据库:而mongoose是一种能在node环境中优雅地操作mongodb的对象模型工具 ...

  9. 大龄程序员的出路在哪里?八年老Android的一点心得

    这篇文章,给大家聊聊Android工程师的职业发展规划的一些思考,同时也给不少20多岁.30多岁,但是对自己的职业未来很迷茫的同学一些建议. 笔者希望通过此文,帮大家梳理一下程序员的职业发展方向,让大 ...

  10. webpack 配置文件外置

    转自:https://www.jianshu.com/p/377bfd2d9034 1.问题初衷 解决问题的初衷,源于vue项目中公共路径在打包之后一旦遇到整体的路径更改就需要再次build一下. 如 ...