JSP文件上传--Smartupload组件

时间:2023-03-10 02:39:08
JSP文件上传--Smartupload组件

把smartupload.jar copy到D:\apache-tomcat-7.0.57\lib下。

创建htm上传文件:smartupload_demo01.htm

由于是上传文件,需要对表单进行封装: enctype="multipart/form-data"

<html>
<head><title>www.mldnjava.cn,MLDN高端Java培训</title></head>
<body>
<form action="smartupload_demo01.jsp" method="post" enctype="multipart/form-data">
请选择要上传的文件:<input type="file" name="pic">
<input type="submit" value="上传">
</form>
</body>
</html>

表单完成就可以上传,但是需要在D:\Workspace下新建一个upload文件夹,保存所有上传的文件

完成后,要想上传,需要按照以下步骤:

1. 实例化SmartUpload对象

2. 初始化上传的操作

3. 准备上传

4. 保存文件

smartupload_demo01.jsp:

<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="org.lxh.smart.*"%>
<html>
<head><title>www.mldnjava.cn,MLDN高端Java培训</title></head>
<body>
<%
SmartUpload smart = new SmartUpload() ;
smart.initialize(pageContext) ; // 初始化上传操作
smart.upload() ; // 上传准备
smart.save("upload") ; // 文件保存
%>
</body>
</html>

就会发现,文件已经保存在:D:\Workspace\upload 文件夹里。

特点:原本文件名没有改变。

现在也有个问题,如果进行文件上传,就需要对表单进行封装,但是表单一旦封装后,就无法使用request.getParameter()接收参数。

smartupload_demo02.htm,传送一个name会怎么样?

<html>
<head><title>www.mldnjava.cn,MLDN高端Java培训</title></head>
<body>
<form action="smartupload_demo02.jsp" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="uname"><br>
照片:<input type="file" name="pic"><br>
<input type="submit" value="上传">
<input type="reset" value="重置">
</form>
</body>
</html>

smartupload_demo02.jsp

由于表单被封装,表单无法接收。所有的数据不再是文本,而是二进制的byte流,此时要接收,使用SmartUpload的方法来获得,见代码:smart.getreQuest().getParameter()

<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="org.lxh.smart.*"%>
<%@ page import="cn.mldn.lxh.util.*"%>
<html>
<head><title>www.mldnjava.cn,MLDN高端Java培训</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 + fileName) ;
%>
<%=smart.getFiles().getFile(0).getFileName().matches("^\\w+.(jpg|gif)$")%>
<h2>姓名:<%=name%></h2>
<img src="../upload/<%=fileName%>">
</body>
</html>

程序中还有一个问题,如果多个用户上传的文件名一样,就会发生覆盖的现象。为解决这个,采用自动命名的方式

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

如果IP地址是 192.168.12.19,日期是2009-09-19 21:15:35.123,三位随机数是 678

拼凑出来的文件名就是 19216801201920080919211535123678.文件后缀

需要一个类IpTimeStamp.java:

package cn.mldn.lxh.util ;
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() ;
for(int i=0;i<3;i++){
buf.append(r.nextInt(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.1.1").getIPTimeRand()) ;
}
}

不管上传多少个文件都是利用getFiles()完成的,以下例子就可以上传多个文件:

smartupload_demo03.htm

<html>
<head><title>www.mldnjava.cn,MLDN高端Java培训</title></head>
<body>
<form action="smartupload_demo03.jsp" method="post" enctype="multipart/form-data">
照片1:<input type="file" name="pic1"><br>
照片2:<input type="file" name="pic2"><br>
照片3:<input type="file" name="pic3"><br>
<input type="submit" value="上传">
<input type="reset" value="重置">
</form>
</body>
</html>

smartupload_demo03.jsp:

<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="org.lxh.smart.*"%>
<%@ page import="cn.mldn.lxh.util.*"%>
<html>
<head><title>www.mldnjava.cn,MLDN高端Java培训</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地址
for(int x=0;x<smart.getFiles().getCount();x++){
String ext = smart.getFiles().getFile(x).getFileExt() ; // 扩展名称
String fileName = its.getIPTimeRand() + "." + ext ;
smart.getFiles().getFile(x).saveAs(this.getServletContext().getRealPath("/")+"upload"+java.io.File.separator + fileName) ;
}
%>
</body>
</html>

通过SmartUpload上传比较方便,FileUpload比较难。