表单封装问题

在Smartupload上传组件【上】中我们学习了Smartupload上传的应用,但是我们说那个程序有一点问题,什么问题呢?我们已经知道了要进行文件上传,则肯定要对表单进行封装,问题就在表单封装这里,表单一旦封装之后,就无法使用request.getParameter()来接受参数了。例如:在表单中定义了姓名等变量,在.jsp中就不能用request.getParameter()来接受这个名字了。一个例子看一下到底怎么不能接受

   
   
   
   
  1. smart_02.html  
  2. <html> 
  3. <head> 
  4. <title>WEB开发title> 
  5. head> 
  6. <body> 
  7. <form action="smart_02.jsp" method="post" enctype="multipart/form-data"> 
  8.   姓名:<input type="text" name="uname"><br>   //定义名字  
  9.   照片:<input type="file" name="pic"> 
  10.     <input type="submit" value="上传"><br> 
  11.     <input type="reset" value="重置"> 
  12. form> 
  13. body> 
  14. html> 

 

有了.html页了 再来做.jsp页面用来接受图片和姓名

   
   
   
   
  1. smart_02.jsp  
  2. <%@ page language="java" contentType="text/html" pageEncoding="utf-8"%> 
  3. <%@ page import="com.jspsmart.upload.*" %> 
  4. <html> 
  5. <head> 
  6. <title>WEB开发项目title> 
  7. head> 
  8. <body> 
  9. <%  
  10.     request.setCharacterEncoding("utf-8");  
  11. %> 
  12. <%   
  13.    SmartUpload smart=new SmartUpload();  
  14.    smart.initialize(pageContext);// 初始化上传操作  
  15.    smart.upload();       //上传准备  
  16.    smart.save("upload");  //文件保存  
  17. %> 
  18. <h2><%=request.getParameter("uname") %>h2> 
  19. body> 
  20. html> 

在smart_02.jsp中用了request.getParameter()来接受参数,但是运行一下(如下图):结果为null  是一个空值。

文件上传--Smartupload上传组件【中】_第1张图片

也就是说根本就无法接受参数,而且使用getParameterValues()也无法接受,因为在smart_02.html中,姓名属性随着表单被封装了,所有的数据不再是文本了,而是二进制byte流了,那么这个时候要想接受参数就必须使用Smartload中提供的方法支持。

   
   
   
   
  1. 将smart_02.jsp改成如下;  
  2. <%@ page language="java" contentType="text/html" pageEncoding="utf-8"%> 
  3. <%@ page import="com.jspsmart.upload.*" %> 
  4. <html> 
  5. <head> 
  6. <title>WEB开发项目title> 
  7. head> 
  8. <body> 
  9. <%  
  10.     request.setCharacterEncoding("utf-8");  
  11. %> 
  12. <%   
  13.    SmartUpload smart=new SmartUpload();  
  14.    smart.initialize(pageContext);// 初始化上传操作  
  15.    smart.upload();       //上传准备  
  16.    String name=smart.getRequest().getParameter("uname");  
  17.    smart.save("upload");  //文件保存  
  18. %> 
  19. <h2>姓名:<%=name %>h2> 
  20. body> 
  21. html> 

这个时候在运行一下,结果就能正常显示了,但是又有一个新的问题出现了,细心的读者就会发现,如果两次都上传同一张图片,那么在Upload文件夹中只是存在了一张图片,也就是说第二次上传的图片覆盖了第一张,它是 一个覆盖的过程,但是我们希望两张一样的图片都能上传,并且让他们的名字不一样那该怎么办?

为上传文件自动命名功能

大家应该都有过这样的经历:在网上下载一张图片,点击右键图片另存为,接着会弹出图片保存的路径的对话框(如下图),红色区域的名字为一串看不懂的字符,那个字符就是系统为图片自动命名的,而我们所要实现的就是为上传的图片自动分配名字。

文件上传--Smartupload上传组件【中】_第2张图片


关于自动命名功能的实现原理

    如果多个用户上传的文件名称一样,则肯定会发生覆盖的情况,为了解决这种问题,可以采用为上传文件自动命名的方式,为了防止重名,自动命名可以采用如下格式:

       1.  IP地址+时间戳+三位随机数

        2. 例如:现在连接的IP地址为192.168.12.19,日期时间是:2013-03-02 17:58:12,三位随机数为678,则拼凑出的新文件名称就是19216801201920130302125812678.文件后缀名


为了进行文件后缀的拼凑,我们建立一个专门用于此种操作的类---IPTimeStamp,此类作为一个javaBean,在simple包下创建。

   
   
   
   
  1. IPTimeStamp.java  
  2. package simpl;  
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Date;  
  5. import java.util.Random;//随机数  
  6. public class IPTimeStamp {  
  7.         private SimpleDateFormat sdf=null;  //定义SimpleDateFormat对象  
  8.         private String ip=null;        //接受IP地址  
  9.         public IPTimeStamp(){  //无参构造  
  10.         }  
  11.         public IPTimeStamp(String ip){//接受IP地址  
  12.             this.ip=ip;  
  13.         }  
  14.         public String getIPTimeRand(){      //得到IP地址+时间+三位随机数  
  15.             StringBuffer buf=new StringBuffer(); //实例化StringBuffer对象  
  16.             if(this.ip!=null){  
  17.                 String s[]=this.ip.split("\\.");//转义,进行拆分操作  
  18.                 for(int i=0;i<s.length;i++){     //循环设置IP地址  
  19.                     buf.append(this.addZero(s[i],3)); //不够三位数字要补0  
  20.                 }  
  21.             }  
  22.             buf.append(this.getTimeStamp());   //取得时间戳  
  23.             Random r=new Random();             //定义Random对象,以产生随机数  
  24.             for(int i=0;i<3;i++){           //循环三次  
  25.                 buf.append(r.nextInt(10)); //增加一个随机数  
  26.             }  
  27.             return buf.toString();    //返回名称  
  28.         }      
  29.         private String addZero(String str,int len){  //补0操作  
  30.             StringBuffer s=new StringBuffer(); //定义StringBuffer对象  
  31.             s.append(str);          //将传递的内容放到StringBuffer中  
  32.             while(s.length()<len){   //如果不够指定位数,,则在前面补0  
  33.                 s.insert(0, "0");   //补0  
  34.             }  
  35.             return s.toString();  
  36.         }  
  37.         public String getDate(){    //取得当前的系统时间  
  38.             this.sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");  
  39.             return this.sdf.format(new Date());  
  40.         }  
  41.         public String getTimeStamp(){  //取得时间戳  
  42.               this.sdf=new SimpleDateFormat("yyyyMMddHHmmssSSS");  
  43.               return this.sdf.format(new Date());  
  44.         }  
  45. }  

将smart_02.jsp改成如下:

   
   
   
   
  1.  
  2. <%@ page language="java" contentType="text/html" pageEncoding="utf-8"%> 
  3. <%@ page import="com.jspsmart.upload.*" %> 
  4. <%@ page import="simpl.IPTimeStamp"%>  //导入javaBean
  5. <html> 
  6. <head> 
  7. <title>WEB开发项目title> 
  8. head> 
  9. <body> 
  10. <%  
  11.     request.setCharacterEncoding("utf-8");  
  12. %> 
  13. <%   
  14.    SmartUpload smart=new SmartUpload();  
  15.    smart.initialize(pageContext);// 初始化上传操作  
  16.    smart.upload();       //上传准备  
  17.    String name=smart.getRequest().getParameter("uname");  
  18.    //实例化IPTimeStamp对象  
  19.    IPTimeStamp its=new IPTimeStamp(request.getLocalAddr());  
  20.    String ext=smart.getFiles().getFile(0).getFileExt();//取得文件后缀  
  21.    String fileName=its.getIPTimeRand()+"."+ext;//拼凑文件名称  
  22.    smart.getFiles().getFile(0).saveAs(getServletContext().getRealPath("/")  
  23.         +"upload"+java.io.File.separator+fileName);//保存文件  
  24. %> 
  25. <h2>姓名:<%=name %>h2> 
  26. <img src="../upload/<%=fileName %>"> 
  27. body> 
  28. html> 

 

我们来运行一下,写上我的名字:赵玉强,然后上传一张名字为dahai.jpg的图片,结果如下:

文件上传--Smartupload上传组件【中】_第3张图片

可以看见图片和名字都能够正常显示,我们在来看一下upload文件中是否上传上了图片呢?而且图片的名字是否是系统自动命名的呢?打开tomcat/webapps下的项目找到upload文件夹。图片确实有了,如下图所示:

文件上传--Smartupload上传组件【中】_第4张图片 可以发现上传的图片的名字不是上传之前的名字了,而是系统自动上传的名字,而且不管对同一张图片上传多少次,都不会出现只有一张的情况了,因为系统会自动分配给上传图片不同的名字。