文件上传步骤
1. 导包
导入commons-io
和commons-fileupload
jar包
2. 前端页面
action:页面请求,需和web.xml
中匹配
method:设置为post
,没有文件大小限制
enctype:值为multipart/form-data
用于识别是否为文件表单还是普通文本表单
<form action="${pageContext.request.contextPath}/upload.do" enctype="multipart/form-data" method="post">
<input type="file" name="file1">
<br>
<input type="file" name="file2">
<br>
<input type="submit">
<br>
</form>
3. 注册web.xml
<servlet>
<servlet-name>FileUploadServlet</servlet-name>
<servlet-class>com.juyss.servlet.FileUploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FileUploadServlet</servlet-name>
<url-pattern>/upload.do</url-pattern>
</servlet-mapping>
4. 编写Servlet
实现步骤
-
判断表单为普通文本表单还是文件表单
-
创建上传文件的保存根路径
-
创建临时文件的保存根路径
-
获取
FileItem
对象 需要
ServletFileUpload
对象 需要用到
DiskFileItemFactory
对象,用于处理上传路径和限制文件大小 -
通过
FileItem
对象获取文件名,文件后缀 -
使用UUID创建唯一保存路径
-
使用
fileItem.getInputStream()
获取文件输入流 -
创建文件输出流
FileOutputStream fos = new FileOutputStream(savePath + "/" + fileName)
-
关闭流资源,同时删除临时文件
fileItem.delete()
public class FileUploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("进入了FileUploadServlet.class");
//判断表单是否为带有文件的表单
if (!ServletFileUpload.isMultipartContent(request)) {
return; //终止方法运行
}
//定义文件上传后保存的根路径
String rootPath = this.getServletContext().getRealPath("/WEB-INF/upload");
File rootFile = new File(rootPath);
if (!rootFile.exists()) {
rootFile.mkdir();
}
//定义文件缓存路径
String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");
File tempFile = new File(tempPath);
if (!tempFile.exists()) {
tempFile.mkdir();
}
//创建DiskFileItemFactory对象,处理上传路径和限制文件大小
DiskFileItemFactory fileItemFactory = new DiskFileItemFactory(1024 * 1024, tempFile);
//创建ServletFileUpload对象
ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
//获取FileItem对象
List<FileItem> fileItems = null;
try {
fileItems = servletFileUpload.parseRequest(request);
} catch (FileUploadException e) {
e.printStackTrace();
}
if (fileItems==null){
System.out.println("fileItem空指针");
return;
}
Iterator<FileItem> iterator = fileItems.iterator();
//遍历fileItems集合
while (iterator.hasNext()) {
FileItem fileItem = iterator.next();
if (fileItem.isFormField()) {//是普通文本表单
continue; //跳出循环
} else {//是文件表单
//获取文件字段名,标签中name属性的值
String fieldName = fileItem.getFieldName();
//获取文件上传字段中的文件名,一般来说为为文件名(不包含路径信息),在opera浏览器中可能会包含文件路径信息
String name = fileItem.getName();
System.out.println("文件字段名:"+fieldName);
System.out.println("文件名:"+name);
//判断文件名是否合法
if (name.trim().equals("") || name == null) {
continue;
}
//获取文件名和文件后缀
String fileName; //文件名
if (name.contains("/")){ //判断name是否包含路径信息
fileName = name.substring(name.lastIndexOf("/"));
}else{
fileName = name;
}
String fileExtension = fileName.substring(fileName.indexOf(".") + 1);//获取文件后缀
System.out.println("文件名:" + fileName);
System.out.println("文件类型:" + fileExtension);
//获取随机UUID
String uuid = UUID.randomUUID().toString();
//使用uuid创建唯一的文件夹作为文件存放路径
String savePath = rootPath + "/" + uuid; //文件存放路径
File savePathFile = new File(savePath);
if (!savePathFile.exists()) { //路径不存在就创建
savePathFile.mkdir();
}
//获取输入流读取上传的文件
InputStream is = fileItem.getInputStream();
//用输出流保存到本地
FileOutputStream fos = new FileOutputStream(savePath + "/" + fileName);
int len;
byte[] bytes = new byte[1024 * 1024];
while((len = is.read(bytes))!=-1){
fos.write(bytes,0,len);
}
fos.close();
is.close();
//删除临时文件
fileItem.delete();
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}