第一步 创建maven项目(含web框架),配置并测试tomcat服务器
第2步 引入文件上传所需依赖
<!-- servlet实现文件上传 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<!-- 文件上传所需依赖 -->
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
第3步 前端
<form action="${pageContext.request.contextPath}/upload.do" enctype="multipart/form-data" method="post">
用户名:<input type="text" name="username"><br>
<input type="file" name="file1"><br>
<input type="file" name="file2"><br>
<input type="submit"> | <input type="reset">
</form>
第4步 后端
Servlet类编写
public class FileUpload extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if (!ServletFileUpload.isMultipartContent(request)) {
return;
}
String uploadPath = this.getServletContext().getRealPath("WEB-INF/upload");
File uploadFile = new File(uploadPath);
if (!uploadFile.exists()) {
uploadFile.mkdir();
}
String tmpPath = this.getServletContext().getRealPath("WEB-INF/tmp");
File file = new File(tmpPath);
if (!file.exists()) {
file.mkdir();
}
try {
DiskFileItemFactory factory = getDiskFileItemFactory(file);
ServletFileUpload upload = getServletFileUpload(factory);
String msg = uploadParseRequest(upload,request,uploadPath);
request.setAttribute("msg",msg);
request.getRequestDispatcher("/info.jsp").forward(request,response);
} catch (Exception e) {
e.printStackTrace();
}
}
public static DiskFileItemFactory getDiskFileItemFactory(File file){
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024 * 1024);
factory.setRepository(file);
return factory;
}
public static ServletFileUpload getServletFileUpload(DiskFileItemFactory factory){
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setProgressListener(new ProgressListener() {
@Override
public void update(long pByteRead, long lpContentLength, int i) {
System.out.println("总大小:"+lpContentLength+"已上传: "+pByteRead);
}
});
upload.setHeaderEncoding("utf-8");
upload.setFileSizeMax(1024 * 1024 * 10);
upload.setSizeMax(1024 * 1024 * 10);
return upload;
}
public static String uploadParseRequest(ServletFileUpload upload,HttpServletRequest request,String uploadPath) throws FileUploadException, IOException {
String msg = "";
List<FileItem> fileItems = upload.parseRequest(request);
for (FileItem fileItem : fileItems) {
if(fileItem.isFormField()){
String name = fileItem.getFieldName();
String value = fileItem.getString("utf-8");
System.out.println(name+":"+value);
}else{
String uploadFileName = fileItem.getName();
System.out.println("上传的文件名:"+uploadFileName);
if(uploadFileName.trim().equals("")) continue;
String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/")+1);
String suffix = uploadFileName.substring(uploadFileName.lastIndexOf(".")+1);
System.out.println("文件名:"+fileName+"文件类型:"+suffix);
String uuid = UUID.randomUUID().toString();
InputStream inputStream = fileItem.getInputStream();
FileOutputStream fos = new FileOutputStream(uploadPath+"/"+uuid+"."+suffix);
byte[] buffer = new byte[1024*1024];
int len;
while((len = inputStream.read(buffer))>0){
fos.write(buffer,0,len);
}
fos.close();
inputStream.close();
msg = "文件上传成功!";
fileItem.delete();
}
}
return msg;
}
}
web.xml文件配置
<servlet>
<servlet-name>FileUpload</servlet-name>
<servlet-class>com.kuang.FileUpload</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FileUpload</servlet-name>
<url-pattern>/upload.do</url-pattern>
</servlet-mapping>
上传文件目录
总结
引入commons-io,commons-fileupload依赖
**理解**在使用ServletFileUpload对象解析请求时需要DiskFileItemFactory对象。
所以,我们需要在进行解析工作前构造好DiskFileItemFactory对象,
通过ServletFileItem对象的构造方法或setFileItemFactory()
设置ServletFileUpload对象的fileItemFactory属性。