文件上传
实现原理
使用类介绍
ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个FikeItem对象,在使用ServletFileUpdload对象解析请求时需要DIskFileItemFactory对象。所以我们需要在进行解析工作前构造好DiskFileItemFactory对象,通过ServletFileUpload对象的构造方法或setFileItemFactory()方法设置SevletFileUpload对象的fileItemFactory属性
01-准备工作
对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器的。
一般选择采用apache的开源工具common-fileupload这个组件上传
02-网页支持
<%--通过表单上传文件
get:上传大小有限制
post:上传大小没有限制
必须要有enctype这个属性设置
--%>
<form enctype="multipart/form-data" action="" method="post">
<p><input type="file"></p>
<input type="submit">
</form>
03-servlet编写
package com.XZY_SUNSHINE.down;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class downServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("......");
//判断上传文件是普通的表单还是带文件的表单
if (!ServletFileUpload.isMultipartContent(request)){
return;//进入if说明是普通的文件我们返回什么都不做即可
}//如果通过了这个if说明我们的表单是带文件上传的
//创建文件上传的保存路径
String uploadPath="e:\\java\\Upload";
File file = new File(uploadPath);
if (!file.exists()){
//通过目录不存在,创建一个这样的目录
file.mkdir();
}
//缓存,临时文件路径
//假如文件超过了预期的大小,我们就把他放到一个临时文件中,过几天就自动清除
String tempPath="e:\\java\\temp";
File tempfile = new File(tempPath);
if (!tempfile.exists()){
//通过目录不存在,创建一个这样的目录
tempfile.mkdir();
}
//处理上传文件
//1.创建DiskFileItemFactory对象,处理上传路径和大小限制
DiskFileItemFactory factory=new DiskFileItemFactory();
factory.setRepository(tempfile);//临时保存目录
//2.获取ServletFileUpload
ServletFileUpload upload = new ServletFileUpload(factory);
//监听文件上传进度:平时见的进度条
upload.setProgressListener(new ProgressListener() {
@Override
//pBytesRead:已经读取到文件的大小
//pContentLength:文件大小
public void update(long pBytesRead, long pContentLength, int pitems) {
System.out.println("总大小:"+pContentLength + " 已上传:"+pBytesRead);
}
});
upload.setHeaderEncoding("utf-8");//处理乱码问题
//3.处理上传文件
try {
//把前端请求封装成一个fileitem对象
List<FileItem> fileItems=upload.parseRequest(request);
for (FileItem fileitem:fileItems) {
if (!fileitem.isFormField()){
//判断是不是上传文件
String uploadname=fileitem.getName();
//获取文件名
String filename=uploadname.substring(uploadname.lastIndexOf("/")+1);
//获取文件后缀名
String fileextname=uploadname.substring(uploadname.lastIndexOf(".")+1);
//获取uuid:唯一辨识符
String uuidpath= UUID.randomUUID().toString();
String realpath=uploadPath+"/"+uuidpath;
File realpathfile = new File(realpath);
if (!realpathfile.exists()){
realpathfile.mkdir();
}
//获取文件的输入流
InputStream inputStream = fileitem.getInputStream();
int len=0;
byte[] buffer=new byte[1024*1024];
FileOutputStream fileOutputStream = new FileOutputStream(realpath + "/" + filename);
while((len=inputStream.read(buffer))>0){
fileOutputStream.write(buffer,0,len);
}
fileOutputStream.close();
inputStream.close();
fileitem.delete();
System.out.println("上传成功!");
System.out.println("..");
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
}
04-xml配置
<servlet>
<servlet-name>upload</servlet-name>
<servlet-class>com.XZY_SUNSHINE.down.downServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>upload</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>