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>
现在根本无法接受参数,而且使用getParameter()也无法接收,因为表单被封装了,所有的数据不再是文本了,而是(enctype="multipart/form-data")二进制的byte 流了,那么这个时候要想接收,则必须使用SmartUpload中提供的方法支持。方法如下:
<%@ 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,此类专门完成这种功能。
如果要想对上次文件的后缀进行限制的话,则缺点文件名称判定即可
这个可以通过正则完成, 从之前发现,不管上传多少个文件,都是通过getFiles() 方法取得,那么限制就可以利用此操作完成多个文件的上传。<%=smart.getFiles().getFile(0).getFileName().matches("^\\w+.(jpg|gif)$")%>
而且可以发现使用SmartUpload 操作的去容易,FileUpload就费劲些