SmartUpload上传组件.docx
《SmartUpload上传组件.docx》由会员分享,可在线阅读,更多相关《SmartUpload上传组件.docx(22页珍藏版)》请在冰豆网上搜索。
SmartUpload上传组件
1、课程名称:
SmartUpload上传组件
2、知识点
2.1、上次课程的主要知识点
1、数据库连接池的基本原理;
2、在Tomcat中配置及使用数据库连接池。
2.2、本次预计讲解的知识点
1、上传组件的主要作用及简介;
2、Smartupload组件的基本使用;
3、掌握UUID类的操作及使用。
3、具体内容
3.1、上传组件
在很多的应用程序中都会存在上传文件,在HTML的表单中也是存在此类操作的,例如:
编写一个file表单:
但是文件选择容易,上传麻烦,因为一旦要想完成文件上传的话,表单首先必须进行封装,例如:
如果有文件上传,那么提交的内容就不再是普通文本了,而是二进制数据了,所以为了区分,表单首先必须使用enctype属性封装:
而这个时候在JSP中最早可以使用request进行接收,但是处理起来那是相当的麻烦,因为所有的数据都混在一起了,所以后来随着应用的深入,有了上传组件,其中有两个最有代表性的:
·Smartupload:
是一个非常好用的组件,但是遗憾的是,开发此组件公司完了,但是此组件直到今天这种纯粹使用基本技术开发的时候依然有用;
·ApacheFileUpload:
如果使用了基本技术开发使用起来非常恶心,但是这个恶心在框架技术被解决了,所以现在像Struts框架基本上使用的上传都是Fileupload,而且使用此组件的最大好处是可以按照IO进行操作。
Smartupload本身是以一个开发包的形式出现的,所以要想使用的话,需要将其配置在WEB-INF/lib目录之中。
3.2、进行上传的操作(重点)
现在如果要想完成上传操作,首先应该有一个文件夹保存所有的上传文件,所以在项目之中,直接建立一个upload的文件夹,表示所有的上传文件的保存目录。
范例:
编写表单,可以选择文件
upload.htm
请选择一张您的照片:
范例:
编写上传的upload.jsp页面,完成具体的上传操作——使用SmartUpload组件。
<%@pagecontentType="text/html"pageEncoding="GBK"%>
<%@pageimport="org.lxh.smart.*"%>
upload.htm<%
//1、进行上传组件的初始化操作
SmartUploadsmart=newSmartUpload();
smart.initialize(pageContext);
//2、接收上传的所有内容
smart.upload();
//3、保存上传的内容
smart.save("upload");
%>
此时的确是完成了上传的操作,而且自动的将文件保存在了upload文件夹之中,而且最重要的是上传之后的文件名称与原始文件名称完全一致。
但是在很多情况下应用操作的时候,除了上传图片之外,还会编写一些其他的信息,例如:
姓名等。
范例:
使用混合表单
upload.htm
姓名:
性别:
男
女
照片:
范例:
接收参数并显示,而且将图片保存在upload文件夹之中
<%@pagecontentType="text/html"pageEncoding="GBK"%>
<%@pageimport="org.lxh.smart.*"%>
upload.htm<%
request.setCharacterEncoding("GBK");
//1、进行上传组件的初始化操作
SmartUploadsmart=newSmartUpload();
smart.initialize(pageContext);
//2、接收上传的所有内容
smart.upload();
//3、保存上传的内容
smart.save("upload");
%>
姓名:
<%=request.getParameter("name")%>
性别:
<%=request.getParameter("sex")%>
此时非常遗憾的出现了问题,即:
上传的图片保存了,但是其他信息没有得到,之所以会这样,是因为表单封装之后,是无法使用request取得提交参数的,这个时候就只能依靠SmartUpload中提供的操作了:
<%@pagecontentType="text/html"pageEncoding="GBK"%>
<%@pageimport="org.lxh.smart.*"%>
upload.htm<%
request.setCharacterEncoding("GBK");
//1、进行上传组件的初始化操作
SmartUploadsmart=newSmartUpload();
smart.initialize(pageContext);
//2、接收上传的所有内容
smart.upload();
//3、保存上传的内容
smart.save("upload");
%>
姓名:
<%=smart.getRequest().getParameter("name")%>
性别:
<%=smart.getRequest().getParameter("sex")%>
但是一定要注意的是,这个时候的getRequest()方法,必须在upload()方法执行完之后才可以进行调用。
3.3、为上传文件重命名(重点)
如果使用SmartUpload中的save()方法实际上保存的文件名称与原始的文件名称是一样的,这样一来就很有可能出现覆盖的问题,所以在很多的应用程序上都会将上传之后的文件进行重命名的操作,例如:
给出以下一种文件的命名方式,采用了“IP地址+时间戳+三位随机数”,例如:
当前IP是192.168.1.232、当前时间是:
2010-09-2315:
02:
03.123,则最后生成的文件名称是:
19216800123220100923150203123987,基本上是不会有了,但是取得这种命名的操作类写起来有那么一点点的麻烦,但不是很麻烦,因为在Java中为了解决这样的问题,专门为用户提供了一个操作类——UUID,就是采用了时间戳的形式生成了一个基本上不会重复的文件名称。
范例:
使用UUID
packageorg.lxh.demo;
importjava.util.UUID;
publicclassUUIDTest{
publicstaticvoidmain(String[]args){
Stringname=UUID.randomUUID().toString();
System.out.println(name);
}
}
但是如果真的要进行重新命名的话,则图片的保存就不能再使用了save()方法了,而且要想真正的保存文件,还必须知道文件的绝对路径。
<%@pagecontentType="text/html"pageEncoding="GBK"%>
<%@pageimport="org.lxh.smart.*"%>
upload.htm<%
request.setCharacterEncoding("GBK");
//1、进行上传组件的初始化操作
SmartUploadsmart=newSmartUpload();
smart.initialize(pageContext);
//2、接收上传的所有内容
smart.upload();
StringfileName=java.util.UUID.randomUUID().toString()+"."+smart.getFiles().getFile(0).getFileExt();
StringfilePath=this.getServletContext().getRealPath("/")+"upload"+java.io.File.separator+fileName;
if(smart.getFiles().getSize()>0){
smart.getFiles().getFile(0).saveAs(filePath);//根据指定的路径保存上传图片
}
%>
姓名:
<%=smart.getRequest().getParameter("name")%>
性别:
<%=smart.getRequest().getParameter("sex")%>
<%=fileName%>
<%=filePath%>
<%=smart.getFiles().getSize()%>
/upload/<%=fileName%>"height="200"width="200"/>
另外需要提醒的是,有可能不上传图片,如果要想判断文件是否上传,就判断文件上传的大小。
3.4、实际开发应用
在很多的系统之中都会存在上传文件保存的问题,但是对于文件的保存现在有两种做法:
做法一:
将文件直接保存在数据表之中
在数据表的字段上有种类型是BLOB字段,此种可以保存二进制数据,所以可以直接将上传文件保存在此处,但是保存在此处有以下问题:
·优点:
所有的数据都保存在了数据表之中,如果对于日后的数据库维护方便,因为只需要备份表就够了;
·缺点:
由于所有的数据都保存在了数据库之中,所有对于数据的浏览不方便;
做法二:
文件单独保存,同时做映射文件
在数据表的字段上设置一个普通的VARCHAR2数据类型,而所有的上传文件的名称在此处保存,而真正的文件是保存在了一个独立的文件夹之中,但是这样如下问题:
·优点:
文件方便浏览,而且对于访问也很容易;
·缺点:
对于数据库的备份就需要备份数据还有上传的文件;
3.5、项目开发(重点)
现在要求将Smartupload用于项目的操作上,在项目之中增加每个雇员的照片。
3.5.1、准备工作
现在在emp表中所给予的支持不够,所以要修改表结构,但是每一个人默认的图片就将其设置为“nophoto.jpg”。
第一步:
将smartupload.jar拷贝到项目之中;
第二步:
在项目之中建立一个empphoto的文件夹,用于保存每个雇员的照片;
第三步:
修改表结构,增加两个字段
ALTERTABLEempADD(photoVARCHAR2(200)DEFAULT'nophoto.jpg');
ALTERTABLEempADD(noteCLOBDEFAULT'暂无信息');
第四步:
将默认的图片拷贝到empphoto文件夹之中
3.5.2、增加雇员
由于现在的表结构发生了改变,所以肯定连同VO一起变化,所有的查询也必然改变。
第一步:
修改Emp.java的VO类,增加note和photo
privateStringnote;
privateStringphoto;
第二步:
肯定要修改增加的页面,emp_insert.jsp,因为现在要求表单封装、增加上传图片的选项、增加个人简介的文本。
第三步:
修改一下个人简介的编辑框,增加一个在线编辑器。
第四步:
现在要想增加雇员,肯定要有照片,但是至少应该有一个照片的预览功能。
第五步:
修改EmpDAOImpl类,增加简介和照片的增加的
publicbooleandoCreate(Empvo)throwsException{
Stringsql="INSERTINTOemp(empno,ename,job,hiredate,sal,comm,mgr,deptno,note,photo)VALUES(?
?
?
?
?
?
?
?
)";
this.pstmt=this.conn.prepareStatement(sql);
this.pstmt.setInt(1,vo.getEmpno());
this.pstmt.setString(2,vo.getEname());
this.pstmt.setString(3,vo.getJob());
this.pstmt.setDate(4,newjava.sql.Date(vo.getHiredate().getTime()));
this.pstmt.setDouble(5,vo.getSal());
this.pstmt.setDouble(6,vo.getComm());
if(vo.getMgr()!
=null){//有领导信息
this.pstmt.setInt(7,vo.getMgr().getEmpno());
}else{
this.pstmt.setString(7,null);//将此字段的内容设置为null
}
if(vo.getDept()!
=null){
this.pstmt.setInt(8,vo.getDept().getDeptno());
}else{
this.pstmt.setString(8,null);
}
this.pstmt.setString(9,vo.getNote());
this.pstmt.setString(10,vo.getPhoto());
if(this.pstmt.executeUpdate()>0){
returntrue;
}
returnfalse;
}
第六步:
修改emp_insert_do.jsp页面,增加图片和简介的操作。
但是有一点需要注意的是,如果现在没有增加图片呢,则应该设置默认的nophoto.jpg。
<%//准备SmartUpload操作
SmartUploadsmart=newSmartUpload();
smart.initialize(pageContext);
smart.upload();
%>
对于设置参数的部分应该全部替换成SmartUpload调用。
emp.setNote(smart.getRequest().getParameter("note"));
StringfileName="nophoto.jpg";//默认的图片名称
StringfilePath=null;
if(smart.getFiles().getSize()>0){//有图片上传,需要生成一个新的图片名称
fileName=UUID.randomUUID().toString()+"."+smart.getFiles().getFile(0).getFileExt();//新的图片名称
filePath=this.getServletContext().getRealPath("/")+"empphoto"+java.io.File.separator+fileName;//保存路径
}
emp.setPhoto(fileName);//设置图片的名称
对于文件的保存应该是在数据库数据成功增加之后进行的。
Stringmsg="雇员增加失败!
";
if(ServicesFactory.getIEmpServices().insert(emp)){//成功
if(smart.getFiles().getSize()>0&&filePath!
=null){//有图片上传
smart.getFiles().getFile(0).saveAs(filePath);//保存文件
}
msg="雇员增加成功!
";
}
3.5.3、显示一个雇员的完整信息
之前只是显示出了一个雇员的部分信息,并不包含图片和简介。
第一步:
修改findById()的查询,要求,可以查询出图片和简介
publicEmpfindById(Integerid)throwsException{
Empemp=null;
Stringsql="SELECTe.empno,e.ename,e.job,e.hiredate,e.sal,m,"+
"m.empnomno,m.enamemname,d.deptnodno,d.dname,e.note,e.photo"
+"FROMempe,empm,deptd"
+"WHEREe.empno=?
ANDe.mgr=m.empno(+)ANDe.deptno=d.deptno(+)";
this.pstmt=this.conn.prepareStatement(sql);
this.pstmt.setInt(1,id);
ResultSetrs=this.pstmt.executeQuery();
if(rs.next()){
emp=newEmp();
emp.setEmpno(rs.getInt
(1));
emp.setEname(rs.getString
(2));
emp.setJob(rs.getString(3));
emp.setHiredate(rs.getDate(4));
emp.setSal(rs.getDouble(5));
emp.setComm(rs.getDouble(6));
Empmgr=newEmp();
mgr.setEmpno(rs.getInt(7));
mgr.setEname(rs.getString(8));
emp.setMgr(mgr);
Deptdept=newDept();
dept.setDeptno(rs.getInt(9));
dept.setDname(rs.getString(10));
emp.setDept(dept);
emp.setNote(rs.getString(11));
emp.setPhoto(rs.getString(12));
}
returnemp;
}
第二步:
修改emp_show.jsp页面,增加以上的显示
3.5.4、删除雇员信息
如果现在要想完成删除的操作,首先应该确认一点,如果一个雇员删除了,则照片也应该同时删除,但是删除的时候应该保证一点,原始的图片名称如果是nophoto.jpg,肯定不能删。
第一步:
在删除的操作的链接之后多传递一个图片的名称
因为有可能牵扯到图片的删除问题。
empno=<%=emp.getEmpno()%>&ls=<%=lineSize%>
&cp=<%=currentPage%>&photo=<%=emp.getPhoto()%>"onclick="returnconf()">
删除
第二步:
DAO操作之中现在并没有图片的查询,所以应该修改EmpDAOImpl中的findAll()和findDetails()两个方法。
publicListfindAllDetails(StringkeyWord,intcurrentPage,
intlineSize)throwsException{
Listall=newArrayList();
Stringsql="SELECT*FROM"
+"(SELECTe.empno,e.ename,e.job,e.hiredate,e.sal,m,"
+"m.empnomno,m.enamemname,d.deptnodno,d.dn