第一步:导入两个依赖jar包(这两个包是apache公司提供的支持文件上传功能的第三方库)
1)commons-fileupload-1.3.1.jar
2)commons-io-2.4.jar
第二步:编写一个文件上传的Controller层——这里就拿我之前写的网上商城购物系统中的图片文件上传来举例
1 package com.lzp.controller; 2 3 import com.lzp.util.DateUtils; 4 import org.apache.commons.fileupload.FileItem; 5 import org.apache.commons.fileupload.disk.DiskFileItemFactory; 6 import org.apache.commons.fileupload.servlet.ServletFileUpload; 7 8 import javax.servlet.ServletException; 9 import javax.servlet.annotation.WebServlet; 10 import javax.servlet.http.HttpServlet; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpServletResponse; 13 import java.io.File; 14 import java.io.IOException; 15 import java.util.Date; 16 import java.util.List; 17 import java.util.UUID; 18 19 /** 20 * @Author LZP 21 * @Date 2020/10/10 13:42 22 * @Version 1.0 23 * 24 * 上传文件控制器 25 */ 26 @WebServlet(name = "UploadFileController", urlPatterns = "/uploadFileController") 27 public class UploadFileController extends HttpServlet { 28 29 private BusinessGoodsController businessGoodsController = new BusinessGoodsController(); 30 31 @Override 32 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 33 // 1、创建工厂类:DiskFileItemFactory factory=new DiskFileItemFactory(); 34 DiskFileItemFactory factory = new DiskFileItemFactory(); 35 // 2、创建解析器:ServletFileUpload upload=new ServletFileUpload(factory); 36 ServletFileUpload upload = new ServletFileUpload(factory); 37 upload.setHeaderEncoding("UTF-8"); 38 39 // 通过getRealPath方法去找到上传文件的路径 40 String fileDirStr = req.getSession().getServletContext().getRealPath("/goodsImg"); 41 System.out.println("文件目录:" + fileDirStr); 42 43 // 设置缓冲区大小与临时文件目录 44 factory.setSizeThreshold(1024 * 1024 * 10); 45 // 设置单个文件大小限制 46 upload.setFileSizeMax(1024 * 1024 * 10); 47 // 设置所有文件总和大小限制 48 upload.setSizeMax(1024 * 1024 * 100); 49 50 // 3、使用解析器解析request对象:List<FileItem> list=upload.parseRequest(request); 51 /** 52 * FileItem 53 * String getFieldName():获取表单项的name的属性值。 54 * String getName():获取文件字段的文件名。如果是普通字段,则返回null 55 * String getString():获取字段的内容。如果是普通字段,则是它的value值;如果是文件字段,则是文件内容。 56 * String getContentType():获取上传的文件类型,例如text/plain、image。如果是普通字段,则返回null。 57 * long getSize():获取字段内容的大小,单位是字节。 58 * boolean isFormField():判断是否是普通表单字段,若是,返回true,否则返回false。 59 * InputStream getInputStream():获得文件内容的输入流。如果是普通字段,则返回value值的输入流 60 */ 61 62 try { 63 List<FileItem> list = upload.parseRequest(req); 64 System.out.println(list); 65 String goodsName = ""; 66 int goodsClassId = 0; 67 String seller = ""; 68 String provider = ""; 69 int price = 0; 70 int amount = 0; 71 String imgPath = ""; 72 Date publishDate = null; 73 String content = ""; 74 for (FileItem fileItem : list) { 75 /* 76 * 对表中的普通字段进行处理 77 */ 78 if(fileItem.isFormField()) { 79 if ("goodsName".equals(fileItem.getFieldName())) { 80 goodsName = fileItem.getString("UTF-8"); 81 } else if("goodsClassId".equals(fileItem.getFieldName())) { 82 goodsClassId = Integer.parseInt(fileItem.getString("UTF-8")); 83 } else if ("seller".equals(fileItem.getFieldName())) { 84 seller = fileItem.getString("UTF-8"); 85 } else if ("provider".equals(fileItem.getFieldName())) { 86 provider = fileItem.getString("UTF-8"); 87 } else if ("price".equals(fileItem.getFieldName())) { 88 price = Integer.parseInt(fileItem.getString("UTF-8")); 89 } else if ("amount".equals(fileItem.getFieldName())) { 90 amount = Integer.parseInt(fileItem.getString("UTF-8")); 91 } else if ("publishDate".equals(fileItem.getFieldName())) { 92 publishDate = DateUtils.strToUtilNoTime(fileItem.getString("UTF-8")); 93 } else if ("content".equals(fileItem.getFieldName())) { 94 content = fileItem.getString("UTF-8"); 95 } 96 } else { 97 /* 98 * 对文件进行处理 99 */ 100 // 这里获取文件名只是用来获取该文件的类型,(即后缀名) 101 String fileName = fileItem.getName(); 102 String uuid = UUID.randomUUID().toString(); 103 //获取文件的后缀名 104 String suffix = fileName.substring(fileName.lastIndexOf(".")); 105 //获取文件上传目录路径,在项目部署路径下的upload目录里。若想让浏览器不能直接访问到图片,可以放在WEB-INF下 106 107 /** 108 * 开始写文件操作 109 */ 110 fileItem.write(new File(fileDirStr, uuid + suffix)); 111 112 imgPath = (uuid + suffix); 113 } 114 } 115 116 /** 117 * 将前端传来的字段参数都获取到 118 */ 119 System.out.println(fileDirStr); 120 System.out.println(goodsName); 121 System.out.println(goodsClassId); 122 System.out.println(seller); 123 System.out.println(provider); 124 System.out.println(price); 125 System.out.println(amount); 126 System.out.println(imgPath); 127 System.out.println(publishDate); 128 System.out.println(content); 129 130 // 通过调用商品控制器中的方法去添加商品 131 businessGoodsController.add(goodsName, goodsClassId, seller, provider, price, amount, imgPath, publishDate, content, req, resp); 132 133 } catch (Exception e) { 134 e.printStackTrace(); 135 } 136 137 } 138 139 @Override 140 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 141 System.out.println("该业务不支持GET提交方式哦"); 142 } 143 }
第三步:前端页面提供文件上传功能的组件
这样就可以实现文件上传了,快去试试吧!