SmartUpload 上传文件


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,此类专门完成这种功能。

如果要想对上次文件的后缀进行限制的话,则缺点文件名称判定即可

<%=smart.getFiles().getFile(0).getFileName().matches("^\\w+.(jpg|gif)$")%>
这个可以通过正则完成, 从之前发现,不管上传多少个文件,都是通过getFiles() 方法取得,那么限制就可以利用此操作完成多个文件的上传。


而且可以发现使用SmartUpload 操作的去容易,FileUpload就费劲些




   

你可能感兴趣的:(tomcat,String,upload,ext,Random,import)