SmartUpload上传组件.docx

上传人:b****5 文档编号:28665670 上传时间:2023-07-19 格式:DOCX 页数:22 大小:400.07KB
下载 相关 举报
SmartUpload上传组件.docx_第1页
第1页 / 共22页
SmartUpload上传组件.docx_第2页
第2页 / 共22页
SmartUpload上传组件.docx_第3页
第3页 / 共22页
SmartUpload上传组件.docx_第4页
第4页 / 共22页
SmartUpload上传组件.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

SmartUpload上传组件.docx

《SmartUpload上传组件.docx》由会员分享,可在线阅读,更多相关《SmartUpload上传组件.docx(22页珍藏版)》请在冰豆网上搜索。

SmartUpload上传组件.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 简洁抽象

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1