1、导入Jar包

1、commons-fileupload-1.3.3.jar
2、commons-io-2.6.jar

2、前端代码

  1. <%--Date: 2021/6/22 Time: 14:22--%>
  2. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  3. <html>
  4. <head>
  5. <title>fileupload</title>
  6. </head>
  7. <body>
  8. <h1>Hello World!</h1>
  9. <h3>请选择你要上传的文件</h3>
  10. <hr width="60%" align="left">
  11. <form action="/fileUploadServlet" method="post" enctype="multipart/form-data" >
  12. 用户名: <input type="text" name="username" > <br>
  13. 选择文件: <input type="file" name="pic" > <br>
  14. <input type="submit" value="上传">
  15. </form>
  16. </body>
  17. </html>

3、后端代码

  1. package com.yunhe.servlet;
  2. /*
  3. 1.编写上传页面(index.jsp)
  4. 2.指定上传的路径(upload)
  5. 3.创建Servlet完成文件的上传功能
  6. 1.使用DiskFileItemFactory创建FileItemFactory工场对象
  7. 2.创建servletUpload对象并将工程对象传入
  8. 3.使用servletUpload对象解析请求获取FileItem对象集合
  9. 4.遍历集合判断FileItem类型
  10. 5.使用FileItem对象获取输入流方法获取上传文件保存位置的输入流
  11. 6.创建输出流读取输入流数据输出至指定位置
  12. 7.关闭相应的流
  13. */
  14. import org.apache.commons.fileupload.FileItem;
  15. import org.apache.commons.fileupload.FileUploadException;
  16. import org.apache.commons.fileupload.disk.DiskFileItemFactory;
  17. import org.apache.commons.fileupload.servlet.ServletFileUpload;
  18. import org.apache.commons.io.FilenameUtils;
  19. import org.apache.commons.io.IOUtils;
  20. import javax.servlet.ServletException;
  21. import javax.servlet.annotation.WebServlet;
  22. import javax.servlet.http.HttpServlet;
  23. import javax.servlet.http.HttpServletRequest;
  24. import javax.servlet.http.HttpServletResponse;
  25. import java.io.File;
  26. import java.io.FileOutputStream;
  27. import java.io.IOException;
  28. import java.io.InputStream;
  29. import java.util.List;
  30. @WebServlet("/fileUploadServlet")
  31. public class FileUploadServlet extends HttpServlet {
  32. @Override
  33. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  34. request.setCharacterEncoding("utf-8");// 处理post请求乱码问题
  35. response.setContentType("text/html;charset=UTF-8"); // 响应参数乱码解决方法
  36. FileOutputStream fos = null;
  37. // 使用DiskFileItemFactory创建FileItemFactory工场对象
  38. // 创建DiskFileItemFactory对象
  39. DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
  40. // 创建servletUpload对象(ServletFileUpload)并将工程对象传入
  41. ServletFileUpload servletUpload = new ServletFileUpload(diskFileItemFactory);
  42. // 使用servletUpload对象解析请求获取FileItem对象(一个一个的表单项)集合
  43. //获取request(请求参数中的数据),返回值为list集合,集合中为表单中的参数列表
  44. try {
  45. List<FileItem> fileItems = servletUpload.parseRequest(request);
  46. /*
  47. 表单提交方式必须为post:
  48. method="post"
  49. 表单的enctype属性值必须为multipart/form-data 多组件表单数据
  50. enctype="multipart/form-data"
  51. 在表单中提供文件上传项:
  52. <input type="file" name="pic">
  53. 如果前端表单中的特定参数没有设置会报以下错误:
  54. the request doesn't contain a multipart/form-data or multipart/mixed stream,
  55. content type header is application/x-www-form-urlencoded
  56. */
  57. //遍历获取的表单参数列表集合
  58. for (FileItem fileItem : fileItems){
  59. //一个一个的表单项
  60. //判断表单项的类型
  61. if (!fileItem.isFormField()){ //是普通的表单吗?取反,不是普通的表单项,执行方法体
  62. //获取上传的文件
  63. /*
  64. 1.重名问题
  65. 重新拼接文件名
  66. 2.文件类型问题
  67. 重新拼接的文件名和获取源文件的后缀名进行拼接
  68. 3.文件上传路径问题
  69. 有则直接放入,无则创建
  70. */
  71. // 利用commons-io工具类
  72. String oldfilename = fileItem.getName(); //获取上传文件全名
  73. String baseName = FilenameUtils.getBaseName(oldfilename);//获取上传文件的名称
  74. String fileType = FilenameUtils.getExtension(oldfilename);//获取上传文件的后缀
  75. //拼接新的文件名
  76. String newfilename = baseName + System.currentTimeMillis() + "." +fileType;
  77. //获取输入流,读取前端传过来的文件
  78. InputStream is = fileItem.getInputStream();
  79. //获取包存文件的目标路径
  80. String realPath = this.getServletContext().getRealPath("/upload/");
  81. //判断路径是否真实存在
  82. File file = new File(realPath);
  83. if (!file.exists()){ //判断目录的真实性,是否存在? 取反,不存在的情况下执行方法体
  84. file.mkdir(); //创建该目录
  85. /*
  86. mkdir:创建该目录
  87. mkdirs:创建该目录的父类目录,如果父类目录不存在的情况下
  88. */
  89. }
  90. //创建输出流,写文件到目录中
  91. //file:目录路径,newfilename:新名称
  92. fos = new FileOutputStream(new File(file, newfilename));
  93. //利用commons-io工具类的copy方法
  94. IOUtils.copy(is,fos); //copy(输入流,输出流)
  95. //上传成功,给前端一个提示
  96. response.getWriter().write("<script>alert('上传完成');</script>");
  97. }
  98. }
  99. } catch (FileUploadException e) {
  100. e.printStackTrace();
  101. }finally {
  102. //释放资源
  103. if (fos != null) {
  104. fos.close();
  105. }
  106. }
  107. }
  108. @Override
  109. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  110. this.doPost(request, response);
  111. }
  112. }