其中涉及到的jar包

jsp显示层:

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

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

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>success</title>
</head>
<body>
<h3>文件上传成功! </h3>
<table border="1" width="500px">
<tr>
<th>编号</th>
<th>文件名</th>
<th>大小</th>
<th>类型</th>
<th>上传时间</th>
</tr>
<c:forEach items="${fileList}" var="bean" varStatus="varSta">
<tr>
<td>${varSta.count }</td>
<td>${bean.name }</td>
<td>${bean.size }</td>
<td>${bean.type }</td>
<td>${bean.addTime }</td>
</tr>
</c:forEach>
</table>
</body>
</html>

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

package entity;

public class FileBean {
private String name; // 文件名称
private String size; // 大小
private String type; // 类型
private String addTime; // 上传时间
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getAddTime() {
return addTime;
}
public void setAddTime(String addTime) {
this.addTime = addTime;
} }

servlet逻辑层代码:

package upload;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils; import entity.FileBean;
/**
* 多文件上传!
*
* 使用apache的文件上传和下载的组件
* 1.导入jar包
* commons-fileload-1.2.2.jar
* commons-io-2.1.jar 一个IO流工具(更方便)
* @author mzy
*
*/
public class UpLoadDemo03 extends HttpServlet { private static final long serialVersionUID = 987003232758385500L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
DecimalFormat df = new DecimalFormat("#.00");
try {
DiskFileItemFactory factory = new DiskFileItemFactory(10*1024, new File("e:/temp")); ServletFileUpload upload = new ServletFileUpload(factory); /* 3.解析文件
* 该方法会自动读取请求的实体内容中所有上传文件的信息。
* List:可以是多个文件
*
* 其中解析request中的文件的个数:
* 需要注意的是,并不一定是用户实际上传的文件数量
* 如果我jsp中有三个input标签,但是用户只上传了两个,就
* submit了;但是在实际解析request的时候,还是解析的三
* 个文件,因为解析的文件个数是由input标签的个数决定的!
* 所以在这种情况下,三个input只使用了两个的话,就会报错!
* 可能要通过异常处理,自定义此异常在实际运用中解决!
*
* 其次:
* 注意jsp中进行文件传递的input标签(type="file")
* 必须要有name属性,因为在源码构造的时候,需要传入
* name属性进行文件解析(虽然我们使用不到name属性)
*
* 然后:
* 文件名相同情况,不能解决,如果上传的文件相同直接
* 覆盖掉了!
* 可能首先要对目录下的file文件进行名字判断isEixt?
*/ List<FileItem> list = upload.parseRequest(request);
/*
* 我们将每个文件的基本信息存放到我们构建的文件的javaBean对象中去!
* 最后上传成功之后,显示到表现层!
*/
List<FileBean> fileList = new ArrayList<FileBean>();
/*
* 设置文件头编码,来解决某些服务端默认编码造成的中文乱码问题!
*/
upload.setHeaderEncoding("utf-8"); // 将上传的文件的信息读取出来
for (FileItem item : list) {
String name = item.getName();
if(name.contains("\\")) {
name = name.substring(name.lastIndexOf("\\")+1, name.length());
}
// 文件大小:单位应该是KB
long size = item.getSize();
// 类型
String contentType = item.getContentType();
/*
* 对文件的大小单位做转化:
* 1024B = 1KB
* 1024*1024B = 1MB
* 1024*1024*1024B = 1GB
*/
String sizeString;
double tempSize;
if(size >= 1024 && size < 1024 * 1024) {
tempSize = size/1024.0;
sizeString = df.format(tempSize)+"KB";
} else if(size > 1024 * 1024 &&
size <= 1024 * 1024 * 1024) {
tempSize = size/(1024*1024.0);
sizeString = df.format(tempSize)+"MB";
} else if(size >= 1024 * 1024 * 1024) {
tempSize = size/(1024*1024*1024.0);
sizeString = df.format(tempSize)+"GB";
} else {
sizeString = size+"B";
}
// 封装FileBean对象
FileBean bean = new FileBean();
bean.setName(name);
bean.setType(contentType);
bean.setSize(sizeString);
bean.setAddTime(sdf.format(new Date()));
// 将bean对象放入到fileList中去!
fileList.add(bean); // 文件内容
InputStream in = item.getInputStream(); FileUtils.copyInputStreamToFile(in, new File("e:/files/"+name)); /*
* 注意:
* 在我文件上传完成之后,本地的临时文件
* 不会自动删除,所以要我们手动的进行删除!
*/
item.delete();
}
request.setAttribute("fileList", fileList);
/*
* 请求转发是浏览器行为:
* success.jsp界面直接位于webRoot根目录下
*/
request.getRequestDispatcher("/03.upload_success.jsp").forward(request, response);
} catch (Exception e) {
e.printStackTrace();
// throw new RuntimeException(e.getMessage());
} } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8"); doGet(request, response);
} }

其中提到的多个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. 【学习笔记】Tensor多维数组和axis的理解

    Tensor多维数组和axis的理解 今天在编写程序的时候一直对于axis=0或等于1搞不明白,这样对于整个numpy或者是tensorflow的基本运算和数据处理都会很模糊,所以花了一些时间来搞清楚 ...

  2. JS进度条顺滑版实现

    进度条不顺滑 相信大多前端同学都自己写过音频.视频播放器,实现并不复杂.最近在小程序里,做了一个类似微博刷视频的需求.其中有一部分功能需要实现自定义进度条,在做完第一版之后发现进度条不顺滑,而后想查查 ...

  3. js 数据存入数组

    var tag = []; $('.deltag').each(function(){ if($(this).attr("checked")== 'checked'){ tag.p ...

  4. Apache Flink jobmanager/logs路径遍历CVE-2020-17519

    影响版本 1.11.0 1.11.1 1.11.2 poc http://192.168.49.2:8081/jobmanager/logs/..%252f..%252f..%252f..%252f. ...

  5. Git 修改历史 commits 中的用户名和邮箱

    一.作用 修改某个仓库历史 commit 的用户 name 和 email 信息. 将历史提交记录中的指定 name/email 修改为新的 name/email. 二.步骤 确认本地全局邮箱/用户名 ...

  6. 给每个li延时添加样式动画效果(setInterval,clearInterval)

    btnsAnime($('ul li')) function btnsAnime(pagesl) { var that = this $(pagesl).hide() let i = 0; funct ...

  7. 寄生线虫免疫学研究新路径!华中农业大学胡敏团队报道寄生线虫N-糖基化修饰图谱

    N-糖基化修饰是真核生物中一种重要的蛋白质翻译后修饰,在许多生物学过程中起着关键作用,包括蛋白质折叠.受体-配体相互作用.免疫应答和疾病发病机制等.近年来,高精度质谱技术的出现促进了糖组和糖蛋白质组的 ...

  8. C++ //构造函数调用规则 //1.创建一个类,C++编译器会给每个类添加至少3个函数 //默认构造(空实现) //析构函数(空实现) //拷贝函数(值拷贝) //2.如果我们写了有参构造函数 编译器就不会提供默认构造函数 但是会提供拷贝构造函数 //3.如果我们写了拷贝函数 编译器就不再提供 默认 有参 构造函数

    //构造函数调用规则 #include <iostream> using namespace std; //1.创建一个类,C++编译器会给每个类添加至少3个函数 //默认构造(空实现) ...

  9. Dubbo系列讲解之扩展点实现原理分析【2万字分享】

    Apache Dubbo 是一款微服务开发框架,它提供了 RPC通信 与 微服务治理 两大关键能力.这意味着,使用 Dubbo 开发的微服务,将具备相互之间的远程发现与通信能力, 同时利用 Dubbo ...

  10. CentOS6与CentOS7的几点区别

    重新安装了一个CentOS7,顺便整理一下与自己之前用的CentOS6的区别 CentOS6以下简称c6  CentOS7以下简称c7 1.关于文件系统: c6 6.x使用EXT4,EXT4单个文件系 ...