文件上传的三大要点 一、在文件上传时,表单一定要加enctype=“multipart/form-data” 。 只有使用enctype=“multipart/form-data”,表单才会把文件的内容编码到HTML请求中。 默认enctype=“application/x-www-form-urlencoded”,表单的内容会按URL规则编码。 而enctype="multipart/form-data"不对字符编码。在使用包含文件上传控件的表单时,必须使 用该值。 二、method也一定要使用post请求。因为get请求会有大小的限制。
三、input-->type的属性值必须为--file
文件上传所需的两个jar包
文件上传JSP
<form action="ShouJiServlet?op=wenjianshangchuan" enctype="multipart/form-data" method="post">
<input type="text" name="oprice">
<input type="file" name="img"/>
<input type="text" name="color">
<input type="submit" value="submit">
</form>
action="ShouJiServlet?op=wenjianshangchuan":表示提交表单后,将表单交给ShouJiServlet(Servlet)中的wenjianshangchuan方法(方法名)
op
public class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取到前端的op值
String op = req.getParameter("op");
//判断op是否为空 是空 默认就是进selectall方法
//不为空 op在前端等于什么方法名,走的就是什么方法
op = op == null ? "selectall" : op;
try {
//反射当前这个类 getClass
//调用这个类中的方法 因为方法修饰符为受保护的(protected)
//所以要用getDeclaredMethod这个方法调用
//传参是个两参一个String一个可变长
//op(对应的方法)后边两个是反射该方法的参数
Method method = getClass().getDeclaredMethod(op, HttpServletRequest.class, HttpServletResponse.class);
//因为方法是受保护的所以要用Method对象忽略掉访问权限修饰符
//true为忽略
method.setAccessible(true);
//调用方法invoke
//参数this当前这个方法,及方法的参数
method.invoke(this, req, resp);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
文件上传Servlet
//此类继承BaseSerlvetlet 来为op进行传值 public class ShouJiServlet extends BaseServlet { //实现这个ShouJiServiceImpl类 //里面有添加的方法 private IShouJiService iss = new ShouJiServiceImpl(); protected void wenjianshangchuan(HttpServletRequest request, HttpServletResponse response) throws IOException { //创建实体类对象 给他添加数据 数据库中要有对应的表与字段 ShouJi shouJi = new ShouJi(); /*1判断上传的数据是否为多段 (一个input为一段 多段的才是 文件上传)*/ if (ServletFileUpload.isMultipartContent(request)){ /*创建解析工具类对象--->又需要一个工厂的实现类 所以 创建 工厂实现类 创建磁盘文件项工厂 处理文件上传路径或者大小限制*/ FileItemFactory ff = new DiskFileItemFactory(); /*创建解析工具类对象 因为拿到的中文数据是乱码状态 解析之后就好了 所以要解析类对象*/ ServletFileUpload sfu = new ServletFileUpload(ff); try { /*对象创建好啦 调用解析方法 返回的就是 解析的数据集合*/ List<FileItem> list = sfu.parseRequest(request); /*那么这个集合中有 普通的表单项(type为 text / password...) * 又有 文件表单项 * 不同的项 我们执行方式 就不同 所以 接下来就判断 是普通的 还是 文件的项 * 又因 返回的是 数据集合 所以 是多个表单项 * 那么 如何能够 判断到 每一个表单项的类型 * 所有 要 循坏遍历 每个项的 本质(表单项还是普通项)*/ for (FileItem fileItem : list) { /*isFormField 判断是否是普通的 表单项 * 是 返回 true 执行其中的代码 * 不是 返回 false 执行else中的代码*/ if (fileItem.isFormField()){ /*普通表单项 * 关注的点 * 表单中 name的属性值 * 表单中 value的值*/ System.out.println("普通表单项中的name属性值为:"+fileItem.getFieldName()); /*UTF-8可以解决中文乱码问题*/ System.out.println("普通表单项中的value属性值为:"+fileItem.getString("UTF-8")); //这段就是将数据添加到集合中 //这是普通表单项的 img的文件项在else中 //fileItem.getFieldName() 拿到数据解析后的input的name的属性值 //是否包含我们前端input的name的属性值 oprice color //包含 所以 拿到对应的数据fileItem.getString("UTF-8") //添加至数据库JDBC实现连接 写个新增数据的接口 //类对象调用 实体类中对应属性的set 将数据添加进去 if (fileItem.getFieldName().equals("oprice")){ shouJi.setOprice(Double.parseDouble(fileItem.getString("UTF-8"))); } if (fileItem.getFieldName().equals("color")){ shouJi.setColor(fileItem.getString("UTF-8")); } }else { /*上传文件 表单项 * 表单中 name的属性值 * 表单中 value的值*/ System.out.println("文件表单项中的name属性值为:"+fileItem.getFieldName()); System.out.println("文件表单项中的文件名(图片的名字)为:"+fileItem.getName()); String name = fileItem.getName(); System.out.println(name+"name==========="); /*将上传的图片写到项目中的 img(存放图片的目录)*/ fileItem.write(new File("E:\\qftx\\two\\day46project\\code\\untitled\\web\\img\\"+name)); if (fileItem.getFieldName().equals("img")){ shouJi.setImg(fileItem.getName()); } } } //调用了接口中的添加方法 将实体类的对象 放进去 就添加到数据库了 boolean insert = iss.insert(shouJi); if (insert){ System.out.println("添加成功"); //添加进去后 重定向到 有跳转到列表页面的 Servlet的方法中 response.sendRedirect("ShouJiServlet?op=shoujipage"); } } catch (FileUploadException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } }
拿到数据库的数据 做成表格展示出来的实时数据