SmartUpload
1、smartUpload是由www.jspsmart.com 网站开发的一套上传组件包,可以轻松实现上传及下载功能,smartUpload组件使用简单、可以轻松的实现上传文件类型的限制、也可以轻易取得上传文件的名称、后缀、大小等
2、smartUpload本身是一个系统提供的jar包,用户直接将此包放到classpath下即可,也可以直接拷贝到TOMCAT_HOME\lib 目录之中
3、之所以现在继续讲解此组件的使用,原因是此组件比较简单,特别是针对JSP开发的时候最能体现出来
4、smartUpload 给出的时候是以一个jar的形式给出的,所有要想使用,则必须首先在lib 目录中进行配置
5、虽然使用此组件可以完成上传,但是上传的时候有一点要注意,必须选择好要上传的文件是哪一个,这个选择肯定是HTML中的表单元素完成。
6、由于现在要上传文件了,则表单必须进行封装,因为传递的不再是普通的文本数据,那么表单封装要通过enctype (二进制文件)完成。
<html> <head> <title>欢迎光临</title> </head> <body> <form action="smartupload.jsp" method="post" enctype="multipart/form-data"> 请输入上传文件: <input type="file" name="pic"> <input type="submit" value="上传"> </form> </body> </html>
现在既然表单已经完成,则此时就可以通过smartUpload完成上传,但是在上传之前先建立一个upload的文件夹,这个文件夹保存在web根目录下
建立完成之后,如果要想进行上传操作的话,则必须按照如下的步骤进行
1、实例化SmartUpload 对象
2、初始化上传的步骤
3、准备上传
4、保存文件
<%@ page contentType="text/html" pageEncoding="GBK"%>、 <%@ page import="org.lxh.smart.*"%> <html> <head> <title>欢迎光临</title> </head> <body> <% SmartUpload smart = new SmartUpload(); smart.initialize(pageContext); //初始化上传操作 smart.upload(); //上传准备 smart.save("upload"); //存入指定保存文件 %> </body> </html>
此时已经完成上传,而且最大的特点可以发现,原本的文件名称就是上传之后的文件名称,没有发生任何的改变。
但是,这个时候有一个新的问题出现了,如果要进行文件上传,则肯定要对表单进行封装,单是表单一旦封装之后,则就无法使用 request.getParatermeter() 接受参数了
<%@ page contentType="text/html" pageEncoding="GBK"%>、 <%@ page import="org.lxh.smart.*"%> <html> <head> <title>欢迎光临</title> </head> <body> <% request.setCharacterEncoding("GBK"); %> <% SmartUpload smart = new SmartUpload(); smart.initialize(pageContext); //初始化上传操作 smart.upload(); //上传准备 smart.save("upload"); //存入指定保存文件 %> <h2><%=request.getParameter("uname")%></h2> </body> </html>
<%@ page contentType="text/html" pageEncoding="GBK"%>、 <%@ page import="org.lxh.smart.*"%> <html> <head> <title>欢迎光临</title> </head> <body> <% request.setCharacterEncoding("GBK"); %> <% SmartUpload smart = new SmartUpload(); smart.initialize(pageContext); //初始化上传操作 smart.upload(); //上传准备 String name = smart.getRequest().getParameter("uname"); smart.save("upload"); //存入指定保存文件 %> <h2><%=request.getParameter("uname")%></h2> <h2>名称: <%=name%></h2> </body> </html>
那么应该如何解决文件覆盖的问题呢?
为文件上传自动命名
如果多个用户上传的文件的名称一样,则肯定会发生覆盖的情况,为了解决这种问题,可以采用为上传文件自动命名的方式,为了防止重名,自动命名可以采用如下的格式:
1、IP地址+时间戳+三位随机数
2、例如: 现在练级的IP地址是:192.168.2.3 ; 日期时间是: 2011-11-1 01:41:24.043 ; 三位随机数是:200, 则拼凑出的新文件名称就是:
19216800200320111101014124043200.文件后缀
package com.demo; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; // 文件随机自动命名 public class IPtimeStamp { private SimpleDateFormat sdf = null; private String ip = null; public IPtimeStamp() {} public IPtimeStamp(String ip) { this.ip = ip; } public String getIPtimeRand() { StringBuffer buf = new StringBuffer(); if(this.ip != null) { String s[] = this.ip.split("\\."); for(int i=0; i<s.length; i++) { buf.append(this.addZero(s[i],3)); } } buf.append(this.getTimeStamp()); Random r = new Random(); //后面随机数 加 3位 for(int i=0; i<3; i++) { buf.append(r.nextInt(10)); //所有的数不超过 10 } return buf.toString(); } //返回时间戳 public String getDate() { this.sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss. SSS"); return this.sdf.format(new Date()); } public String getTimeStamp() { this.sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); return this.sdf.format(new Date()); } private String addZero(String str,int len) { StringBuffer s = new StringBuffer(); s.append(str); while(s.length() < len) { s.insert(0,"0"); } return s.toString(); } // public static void main(String args[]) { // System.out.println(new IPtimeStamp("192.168.2.3").getIPtimeRand()); // } }
editplus编辑java文件要放在 E:\webdemo\WEB-INF\classes 路径下面 tomcat才找得到,因为你环境配置决定了
<%@ page contentType="text/html" pageEncoding="GBK"%>、 <%@ page import="org.lxh.smart.*"%> <%@ page import="com.demo.*"%> <html> <head> <title>欢迎光临</title> </head> <body> <% request.setCharacterEncoding("GBK"); %> <% SmartUpload smart = new SmartUpload(); smart.initialize(pageContext); //初始化上传操作 smart.upload(); //上传准备 String name = smart.getRequest().getParameter("uname"); IPTimeStamp its = new IPTimeStamp(request.getRemoteAddr()); //取得客服端的IP地址 String ext = smart.getFiles().getFile(0).getFileExt(); //扩展名称 String fileName = its.getIPTimeRand() + "." + ext; smart.getFiles().getFile(0).saveAs(this.getServletContext().getRealPath("/") + "upload" +java.io.File.separator + "1.gif"); // 把fileName改成 "1.gif"可以通过 有时间我再研究原因 %> <%=smart.getFiles().getFile(0).getFileName().matches("^\\w+.(jpg|gif)$")%> <h2>名称: <%=name%></h2> <h2>ext: <%=ext%></h2> <h2>fileName: <%=fileName%></h2> <img src="../upload/<%=fileName%>"> </body> </html><%--smart.getFiles().getFile(0).saveAs(this.getServletContext().getRealPath("/") + "upload"+ java.io.File.separator + fileName); 这段编译有问题主要是在 fileName问题上面 如果直接改成上传文件名即可 由此可以判断--%>
你想要进行文件后缀的拼凑,则最好建立一个专门用于此种操作的类 --- IPTimeStamp,此类专门完成这种功能。
如果要想对上次文件的后缀进行限制的话,则缺点文件名称判定即可
<%=smart.getFiles().getFile(0).getFileName().matches("^\\w+.(jpg|gif)$")%>这个可以通过正则完成, 从之前发现,不管上传多少个文件,都是通过getFiles() 方法取得,那么限制就可以利用此操作完成多个文件的上传。
而且可以发现使用SmartUpload 操作的去容易,FileUpload就费劲些