1、导入Jar包
1、commons-fileupload-1.3.3.jar
2、commons-io-2.6.jar
2、前端代码
<%--Date: 2021/6/22 Time: 14:22--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>fileupload</title>
</head>
<body>
<h1>Hello World!</h1>
<h3>请选择你要上传的文件</h3>
<hr width="60%" align="left">
<form action="/fileUploadServlet" method="post" enctype="multipart/form-data" >
用户名: <input type="text" name="username" > <br>
选择文件: <input type="file" name="pic" > <br>
<input type="submit" value="上传">
</form>
</body>
</html>
3、后端代码
package com.yunhe.servlet;
/*
1.编写上传页面(index.jsp)
2.指定上传的路径(upload)
3.创建Servlet完成文件的上传功能
1.使用DiskFileItemFactory创建FileItemFactory工场对象
2.创建servletUpload对象并将工程对象传入
3.使用servletUpload对象解析请求获取FileItem对象集合
4.遍历集合判断FileItem类型
5.使用FileItem对象获取输入流方法获取上传文件保存位置的输入流
6.创建输出流读取输入流数据输出至指定位置
7.关闭相应的流
*/
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 org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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;
@WebServlet("/fileUploadServlet")
public class FileUploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");// 处理post请求乱码问题
response.setContentType("text/html;charset=UTF-8"); // 响应参数乱码解决方法
FileOutputStream fos = null;
// 使用DiskFileItemFactory创建FileItemFactory工场对象
// 创建DiskFileItemFactory对象
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
// 创建servletUpload对象(ServletFileUpload)并将工程对象传入
ServletFileUpload servletUpload = new ServletFileUpload(diskFileItemFactory);
// 使用servletUpload对象解析请求获取FileItem对象(一个一个的表单项)集合
//获取request(请求参数中的数据),返回值为list集合,集合中为表单中的参数列表
try {
List<FileItem> fileItems = servletUpload.parseRequest(request);
/*
表单提交方式必须为post:
method="post"
表单的enctype属性值必须为multipart/form-data 多组件表单数据
enctype="multipart/form-data"
在表单中提供文件上传项:
<input type="file" name="pic">
如果前端表单中的特定参数没有设置会报以下错误:
the request doesn't contain a multipart/form-data or multipart/mixed stream,
content type header is application/x-www-form-urlencoded
*/
//遍历获取的表单参数列表集合
for (FileItem fileItem : fileItems){
//一个一个的表单项
//判断表单项的类型
if (!fileItem.isFormField()){ //是普通的表单吗?取反,不是普通的表单项,执行方法体
//获取上传的文件
/*
1.重名问题
重新拼接文件名
2.文件类型问题
重新拼接的文件名和获取源文件的后缀名进行拼接
3.文件上传路径问题
有则直接放入,无则创建
*/
// 利用commons-io工具类
String oldfilename = fileItem.getName(); //获取上传文件全名
String baseName = FilenameUtils.getBaseName(oldfilename);//获取上传文件的名称
String fileType = FilenameUtils.getExtension(oldfilename);//获取上传文件的后缀
//拼接新的文件名
String newfilename = baseName + System.currentTimeMillis() + "." +fileType;
//获取输入流,读取前端传过来的文件
InputStream is = fileItem.getInputStream();
//获取包存文件的目标路径
String realPath = this.getServletContext().getRealPath("/upload/");
//判断路径是否真实存在
File file = new File(realPath);
if (!file.exists()){ //判断目录的真实性,是否存在? 取反,不存在的情况下执行方法体
file.mkdir(); //创建该目录
/*
mkdir:创建该目录
mkdirs:创建该目录的父类目录,如果父类目录不存在的情况下
*/
}
//创建输出流,写文件到目录中
//file:目录路径,newfilename:新名称
fos = new FileOutputStream(new File(file, newfilename));
//利用commons-io工具类的copy方法
IOUtils.copy(is,fos); //copy(输入流,输出流)
//上传成功,给前端一个提示
response.getWriter().write("<script>alert('上传完成');</script>");
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}finally {
//释放资源
if (fos != null) {
fos.close();
}
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}