1.1 文件上传概述
名称 |
描述 |
jspSmartUpload |
应用在jsp上的文件上传和文件下载的组件 |
fileupload |
应用在java上的文件上传技术,由Apache开源组织提供 |
servlet3.0 |
提供了文件上传的技术 |
Struts |
提供了文件上传的技术 |
- 文件上传的条件
- 需要有一个表单
- 表单的method属性的值必须设置为post
- 表单的enctype属性的值需要设置为multipart/form-data
- 表单需要有一个input标签
- input标签type属性的值需要设置为file
- input标签需要有name属性和值
1.2 JSP编写
- 一些属性的注释
- enctype:encode type 编码类型:属性规定了发送服务器之前如何对表单数据进行编码
- application/x-www-form-urlencoded %WE%RT 默认对表单数据进行url编码,不能用于文件上传
- multipart/form-data:表单数据有多个部分组成:既有文本数据,还有文件,图片这些二进制数据设置之后,浏览器会将文件以二进制的方式上传,可以实现多种类型的文
件上传
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>文件上传</h1>
<form action="${pageContext.request.contextPath}/UploadServlet" method="post" enctype="multipart/form-data">
文件信息:<input type="text" name="info"/>
<br />
用户名:<input type="text" name="username"/>
<br />
文件:<input type="file" name="file01" />
<br />
文件2:<input type="file" name="file02" />
<br />
<input type="submit" value="上传"/>
</form>
</body>
</html>
1.3 Servlet的编写
- 编写流程
- 创建一个磁盘文件的工厂对象
- 创建文件上传的核心对象
- 通过核心对象解析请求对象得到一个集合对象,他里面包含所有的表单项对象
- 遍历这个集合对象,得到每一个表单项,判断他是否是普通表单项
- 如果是普通的表单项,获取他的name和value的值
- 如果不是,创建IO流传输
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取表单所提交的数据
//创建磁盘文件的工厂对象
DiskFileItemFactory dfif = new DiskFileItemFactory();
//创建文件上传的核心对象
ServletFileUpload upload = new ServletFileUpload(dfif);
//解析请求对象,获取表单所提交的数据
List<FileItem> items = null;
try {
items = upload.parseRequest(request);
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//遍历集合对象
if(items != null) {
for (FileItem fileItem : items) {
//判断表单项是否是普通的表单项
if(fileItem.isFormField()) {
//确定是普通的表单项
//获取普通表单项name属性的值
String fieldName = fileItem.getFieldName();
//获取普通表单项value属性的值
String fieldValue = fileItem.getString("UTF-8");
System.out.println(fieldName + "=" + fieldValue);
}
else {
//文件上传的表单项
//获取文件名称
String fileName = fileItem.getName();
//获取文件的内容
InputStream is = fileItem.getInputStream();
/*byte[] bys = new byte[1024];
int len = 0;
while((len = is.read(bys)) != -1) {
System.out.println(new String(bys,0,len));
}*/
String realPath = getServletContext().getRealPath("/file");
File file = new File(realPath);
if(!file.exists()) {
//目录不存在,则要创建
file.mkdirs();
}
//创建输出流对象
OutputStream os = new FileOutputStream(realPath + "/" + fileName);
byte[] bys = new byte[1024];
int len = 0;
while((len = is.read(bys)) != -1) {
os.write(bys, 0, len);
}
os.close();
}
}
}
}
1.4 DiskFileItemFactory的常用API
方法 |
描述 |
void setSizeThreshold(int sizeThreshold) |
设置缓冲区大小 |
void setRepository(java.io.File repository) |
设置临时目录 |
DiskFileItemFactory dfif = new DiskFileItemFactory();
// 设置缓冲区大小
dfif.setSizeThreshold(1024 * 1024 * 6);// 6M
// 设置临时目录
String tempPath = getServletContext().getRealPath("/temp");
File temp = new File(tempPath);
if (!temp.exists()) {
temp.mkdirs();
}
dfif.setRepository(temp);
- 注意:
- 如果上传的文件不是很大,先走缓冲区
- 如果上传文件比较大,超过缓冲区的大小,就不走缓冲区了,他会把文件先上传到临时目录中,再把临时目录中的临时文件复制到file目录中
- 需要把整个文件上传工作完成之后才把临时文件复制到我们指定的File目录中
- 需要先把Tomcat关掉才能手动删掉temp里面的文件
- 临时文件临时目录的作用 是做一些续传的操作
1.5 ServletFileUpload的常用API
方法 |
描述 |
static boolean isMultipartContent(javax.servlet.http.HttpServletRequest request) |
用来判断表单 link-tap的属性值是否是mutipart 是返回ture 否则返回 false |
public void setFileSizeMax(long fileSizeMax) |
设置一个请求中单个文件的大小 |
public void setSizeMax(long sizeMax) |
设置一个请求中所有文件的总大小 |
boolean flag = ServletFileUpload.isMultipartContent(request);
if (!flag) {
request.setAttribute("msg", "表单提交数据的方式错误!");
request.getRequestDispatcher("/upload.jsp").forward(request,
response);
return;
}
ServletFileUpload upload = new ServletFileUpload(dfif);
// 设置文件的大小
upload.setFileSizeMax(1024 * 1024 * 40);//40M
// 设置请求中所有文件的总大小
upload.setSizeMax(1024 * 1024 * 40);//40M
- 注意:
- 工厂对象既可以通过构造方法传递,也可以通过他所对应的set方法传递
1.7 FileItem的常用API
方法 |
描述 |
long getSize() |
获取表单上传文件的大小 |
void delete() |
删除临时文件 |
void write(java.io.File file) |
直接写一个文件 |
1.8 上传Servlet 改写
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 判断表单提交数据的方式是否正确
boolean flag = ServletFileUpload.isMultipartContent(request);
if (!flag) {
request.setAttribute("msg", "表单提交数据的方式错误!");
request.getRequestDispatcher("/upload.jsp").forward(request,
response);
return;
}
// 实现文件上传的功能
DiskFileItemFactory dfif = new DiskFileItemFactory();
// 设置缓冲区大小
dfif.setSizeThreshold(1024 * 1024 * 6);// 6M
// 设置临时目录
String tempPath = getServletContext().getRealPath("/temp");
File temp = new File(tempPath);
if (!temp.exists()) {
temp.mkdirs();
}
dfif.setRepository(temp);
ServletFileUpload upload = new ServletFileUpload(dfif);
// 设置文件的大小
// upload.setFileSizeMax(1024 * 1024 * 40);//40M
// 设置请求中所有文件的总大小
// upload.setSizeMax(1024 * 1024 * 40);//40M
List<FileItem> items = null;
try {
items = upload.parseRequest(request);
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (items != null) {
for (FileItem fileItem : items) {
if (fileItem.isFormField()) {
String fieldName = fileItem.getFieldName();
String fieldValue = fileItem.getString("UTF-8");
System.out.println(fieldName + "=" + fieldValue);
} else {
//获取表单上传文件的大小
long size = fileItem.getSize();
if(size > 0) {
String fileName = fileItem.getName();
/*InputStream is = fileItem.getInputStream();
String realPath = getServletContext().getRealPath("/file");
File file = new File(realPath);
if (!file.exists()) {
file.mkdirs();
}
OutputStream os = new FileOutputStream(realPath + "/" + fileName);
byte[] bys = new byte[1024];
int len = 0;
while ((len = is.read(bys)) != -1) {
os.write(bys, 0, len);
}
//关闭输入流,删除临时文件需要
is.close();
os.close();*/
String realPath = getServletContext().getRealPath("/file");
File file = new File(realPath);
if (!file.exists()) {
file.mkdirs();
}
//File uploadFile = new File(file,fileName);
try {
fileItem.write(new File(file,fileName));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//删除临时文件
fileItem.delete();
}
}
}