一、文件上传设计到的技术
*什么是文件上传:把本地文件放到服务器中,这个过程为文件的上传。
*实现文件上传:在servlet里面没有提供上传的技术,需要使用第三方的技术
- 第一种技术:jspsmartupload 适于嵌入执行上传下载操作的JSP文件中,应用模型一:jsp+javabean
- 第二种技术: fileupload 应用于模型二,mvc模式。
--FileUpload 是 Apache commons下面的一个子项目,组件FileUpload依赖于Commons IO组件
二、文件上传三点要求
*实现文件上传要求
-第一个要求:有表单,在表单里面提交方式必须是post
-第二个要求:需要有一个文件的输入项,同时在文件输入项里面必须有name属性
<input type="file" name="file"/>
-第三个要求:form属性
enctype="application/x-www-form-urlencoded"修改为enctype="multipart/form-data"
三、文件上传实现步骤
*文件上传实现步骤(固定的步骤 fileupload)
-第一步:创建一个磁盘文件项工厂 new DiskFileItemFactory()
-第二步:创建核心上传类 new ServletFileUpload(FileItemFactory fileItemFactory)
-第三步:使用核心上传类里面方法解析request对象 ,得到文件上传项
List<FileItem> parseRequest(javax.servlet.http.httpServletRequest request);
-第四步:返回list集合,集合里面的每一个部分都是FileItem
判断是文件输入项还是普通输入项
-第五步:如果是普通输入项,输出内容
如果是文件上传项,执行上传操作(上传代码)
四、核心API,涉及到常用的方法
*涉及的方法,API的使用:
=================
* DiskFileItemFactory:磁盘文件项工厂
- 构造方法:
* 有两个,一个是没有参数的,一个是有参数的
DiskFileItemFactory(int sizeThreshold, java.io.File repository)
- 两个参数:
第一个参数是临时空间的大小
第二个参数临时文件存储路径,上传文件超过了临时空间的大小产生临时文件
DiskFileItemFactory(),当使用没有参数的构造方法,提供了两个方法,可以设置临时空间,存储路径
- setSizeThreshold(int sizeThreshold):设置临时空间的大小,超过该大小,会产生临时文件
- setRepository(java.io.File repository): 临时文件存储路径
================
* ServletFileUpload类
- 构造方法:
-- ServletFileUpload(FileItemFactory fileItemFactory)
- 方法:
- List parseRequest(javax.servlet.http.HttpServletRequest request)
* 解析request对象,返回list集合,集合里面的每部分都是一个FileItem
- setFileSizeMax(long fileSizeMax) :设置单个文件上传的大小
- setSizeMax(long sizeMax):设置所有的文件上传的总的大小
- setHeaderEncoding(java.lang.String encoding):设置上传文件名里面包含中文,设置编码
===============
* FileItem
- isFormField() :是否是一个普通输入项,返回值boolean,是true是一个普通输入项
- getString():得到普通输入项的值
- getString(java.lang.String encoding):处理普通输入项中文乱码
- getFieldName():得到普通输入项的名称
- getName() :得到文件上传的名称
** 有某些浏览器下面,得到不是文件名称,而是带路径的名称
** 需要截取字符串完成操作
//得到上传文件的名称
String filename = fileItem.getName(); //C:\Users\asus\Desktop\1.txt
//得到文件的名称 并不是所有的浏览器都是这样,有些浏览器就是得到文件名称
int lens = filename.lastIndexOf("\\");
if(lens != -1) {
filename = filename.substring(lens+1);
}
- getInputStream():得到文件的输入流
- delete() :删除产生的临时文件
五、代码演示
package com.ayit.upload;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.UUID;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import com.ayit.utils.UploadUtils;
public class Upload extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
// 创建磁盘文件项目工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置临时存储大小和临时文件存储位置
factory.setSizeThreshold(1024 * 1024 * 10);
factory.setRepository(new File(getServletContext().getRealPath("temp")));
// 创建核心上传类
ServletFileUpload upload = new ServletFileUpload(factory);
// 处理文件乱码问题
upload.setHeaderEncoding("utf-8");
//单个文件大小和上传多个文件总大小处理
upload.setFileSizeMax(1024*1024*100);
upload.setSizeMax(1024*1024*1024);
// 解析request
List<FileItem> fileItem = upload.parseRequest(request);
// 遍历集合
for (FileItem fileItem2 : fileItem) {
if (fileItem2.isFormField()) {
//普通输入项获取内容,并处理中文问题
String fieldName = fileItem2.getFieldName();
String username = fileItem2.getString("utf-8");
System.out.println(fieldName+":"+username);
}else{
//文件输入项
//获取文件输入项路径
String filename = fileItem2.getName();
int index = filename.lastIndexOf("\\");
if(index!=-1){
filename = filename.substring(index+1);
}
//获取文件存储路径,目录分离
String realPath = getServletContext().getRealPath("resource");
String path = UploadUtils.getPath(realPath);
String savePath = realPath+path;
File file = new File(savePath);
if(!file.exists()){
file.mkdirs();
}
//处理文件重名问题
String uuid = UUID.randomUUID().toString();
filename = uuid+"_"+filename;
//文件输入流
InputStream in = fileItem2.getInputStream();
//文件输出流
OutputStream out = new FileOutputStream(savePath+"/"+filename);
//流对接
int len = 0;
byte[] b = new byte[1024];
while((len=in.read(b))!=-1){
out.write(b,0,len);
}
in.close();
out.close();
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
<body>
<form action="${pageContext.request.contextPath }/upload" method="post" enctype="multipart/form-data">
<input type="text" name="username"/><br/>
<input type="button" value="添加文件项" onclick="add();">
<div id="div"></div>
<input type="submit" value="上传"/>
</form>
</body>
<script type="text/javascript">
function add(){
var div = document.getElementById("div");
div.innerHTML += "<div><input type='file' name='filename'/><input type='button' value='删除' onclick='del(this)'/><br/></div>";
}
function del(who){
var div = who.parentNode;
var div1 = document.getElementById("div");
div1.removeChild(div);
}
</script>