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 {@Overrideprotected 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();}}}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}}
