刚刚上手的项目 被文件上传困扰了好久,之前用fileupload组件上传,代码参考孤傲苍狼博客,可是除了文件名,表单内的其他内容不知道该怎么读出来进行存储;所以此次采用smartupload组件进行上传
add.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'add.jsp' starting page</title> </head> <body> <form action="backpages/memberIntroduce/addDo.jsp" method="post" enctype="multipart/form-data"> 姓名:<input type="text" name="name"><br> 简介:<input type="text" name="content"><br> 照片:<input type="file" name="photo"><br> <input type="submit" value="提交"> </form> </body> </html>
enctype必须是"multipart/form-data";
addDo.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ page import="com.HQWeb.entity.*"%> <%@ page import="com.HQWeb.dao.*"%> <%@page import="com.jspsmart.upload.SmartUpload"%> <%@page import="com.jspsmart.upload.File"%> <% request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); //创建smartupload组件 SmartUpload su = new SmartUpload(); //初始化组件上下文 su.initialize(pageContext); //上传文件 su.upload(); out.println("上传" + su.save("picture/memberPhoto") + "个文件成功!!!"+"<br>"); //得到表单项 //String name = su.getRequest().getParameter("name"); //String content = su.getRequest().getParameter("content"); String name = new String(su.getRequest() .getParameter("name").trim().getBytes(), "utf-8"); String content = new String(su.getRequest() .getParameter("content").trim().getBytes(), "utf-8"); //获取单个文件 File file = su.getFiles().getFile(0);//可用一个for循环获取多个文件 //判断当前file是否选择了文件;如果没有则继续 if (file.isMissing()) System.out.println("未选择文件");//如果用for循环 则continue //设置上传服务器的位置 String path = "/picture/memberPhoto"; //得到上传文件的名称 String photo = file.getFileName(); //上传文件的路径 path = path + photo; //保存文件 file.saveAs(path, SmartUpload.SAVE_VIRTUAL); System.out.println(photo); Member member = new Member(); member.setName(name); member.setContent(content); member.setPhoto(photo); if (MemberDao.insert(member)) { out.println("操作成功,3秒后返回列表"); response.setHeader("refresh", "3;list.jsp"); } else { out.println("操作失败,3秒钟后返回列表"); response.setHeader("refresh", "3;list.jsp"); } %>
在addDo.jsp页面里面,因为smartupload将全部内容封装,所以request.getParameter并不能获取到字段,需要使用封装好的su.getRequest().getParameter("name");
但又一个问题,上传中文表单时存储到数据库中会显示乱码,使用su.getRequest().getParameter("name").trim().getBytes(), "utf-8");能解决一部分,乱码问题尚待解决
重新自己总结上传文件流程:
1、实例化SmartUpload对象;
<!--[if !supportLists]-->2、 2、<!--[endif]-->初始化组建上下文(initialize(pageContext)方法);
<!--[if !supportLists]-->3、 3、<!--[endif]-->文件上传(upload()方法);
<!--[if !supportLists]-->4、 4、<!--[endif]-->获取表单项;
<!--[if !supportLists]-->5、 5、<!--[endif]-->获取文件(getFiles()返回Files类型,再使用其getFile(index)方法获取单个文件);
<!--[if !supportLists]-->6、 6、<!--[endif]-->设置服务器位置
<!--[if !supportLists]-->7、 7、<!--[endif]-->获取文件名
<!--[if !supportLists]-->8、 8、<!--[endif]-->设置路径;即path+filename path和文件名中间必须有"/"否则会将文件上传至pth路径下,并将文件名称改为该目录文件夹名+文件名
<!--[if !supportLists]-->9、 9、<!--[endif]-->使用file.saveAs(path, SmartUpload.SAVE_VIRTUAL);方法将文件保存至指定目录下