刚刚上手的项目 被文件上传困扰了好久,之前用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);方法将文件保存至指定目录下