工作中经常用到时间戳加上3位随机数获得唯一流水号,下面是代码~
package com.pb.viewer.filename;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
/**
* 在上传文件的操作中,如果多个用户上传的文件名称一样,则肯定会发生覆盖的
* 情况,为了解决这个问题,可以采用为上传文件自动命名的方式
* 自动命名采用的的文件格式如下:IP地址+时间戳+三位随机数
*
* @author Voishion
*
*/
public class IPTimeStamp {
private SimpleDateFormat sdf = null;
private String ip = null;
private String filename = null;
public IPTimeStamp() {
}
public IPTimeStamp(String ip, String filename) {
this.ip = ip;
this.filename = filename;
}
/**
* 得到 IP地址+时间戳+三位随机数 的新文件名
* @return
*/
public String getIPTimeRandName(){
StringBuffer buf = new StringBuffer();
if(this.ip != null){
String str[] = this.ip.split("\\.");
for(int i = 0; i < str.length; i++){
buf.append(this.addZero(str[i], 3));
}
}//加上IP地址
buf.append(this.getTimeStamp());//加上日期
Random random = new Random();
for(int i = 0; i < 3; i++){
buf.append(random.nextInt(10));//取三个随机数追加到StringBuffer
}
buf.append("."+this.getFileExt());//加上扩展名
return buf.toString();
}
/**
* 补0操作【如果不够指定位数,则在前面补0】
* @param str
* @param len
* @return
*/
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();
}
/**
* 取得时间戳
* @return
*/
private String getTimeStamp(){
this.sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
return this.sdf.format(new Date());
}
/**
* 获取文件扩展名
* @return
*/
private String getFileExt(){
int i = this.filename.lastIndexOf(".");//返回最后一个点的位置
String extension = this.filename.substring(i+1);//取出扩展名
return extension;
}
}
单纯给出随机的文件名可能也是解决不了问题的
转载博主链接
但是现在发现另一个问题,我们多次上传一个文件,我们的文件夹里面始终就保存了一个,文件本身的覆盖导致的,
解决方法,为我们上传的文件自动命名
1.IP+时间戳+三位随机数
建立一个类,专门完成文件自动命名
处理文件保存页面的代码如下:
<%
//1.实例化SmartUpload对象
SmartUpload smart=new SmartUpload();
//2.初始化上传操作
smart.initialize(pageContext);
//3.上传准备
smart.upload();
//获取客户端的 IP地址
String ip=request.getRemoteAddr();
/*IpTimeStamp是自己定义的一个类,类
中有一个获得(IP+时间戳+三位随机数)字符串的方法*/
IpTimeStamp its=new IpTimeStamp(ip);
/*获取文件的扩展名.smart.getFiles()是获取我们上传的多
个文件,getFile(0).这里面的0是下标getFileExt()是获取文件的扩展名*/
String ext =smart.getFiles().getFile(0).getFileExt();
//拼接文件名称
String fileName=its.getIpTimeRand()+"."+ext;
//java.io.File.separator是系统分隔符,win7是"\" 这是将文件保存为什么名字
smart.getFiles().getFile(0).saveAs(this.getServletContext().getRealPath("/")+"upload"+java.io.File.separator+fileName);
String name=smart.getRequest().getParameter("uname");
name=new String(name.getBytes(),"UTF-8");
//保存文件
smart.save("upload");
%>
如果感觉这样拼凑起来不是很好,请看我实现的代码
// TODO Auto-generated method stub
//上传与下载
String status=request.getParameter("status");
if(status.equals("upload")){
//上传
//上传文件的地址
String path=getServletContext().getRealPath("/")+"files";
System.out.println(path);
//创建SmartUpload对象
SmartUpload su=new SmartUpload();
//初始化
su.initialize(getServletConfig(), request, response);
/****************开始设置上传文件************************/
/*设置上传文件大小的最大值*/
su.setMaxFileSize(1024*100);
/*设置上传文件类型*/
su.setAllowedFilesList("docx,txt,pptx,xlsx");
/****************开始设置上传文件************************/
try {
//准备上传
su.upload();
//获取客户端IP地址
String ip=request.getRemoteAddr();
/*IPTimeStamp是自己定义的一个类,类中有一个获取(IP+时间戳+三位随机数)字符的方法*/
String name=su.getFiles().getFile(0).getFileName();
System.out.println("name:"+name);
IPTimeStamp its=new IPTimeStamp(ip,name);
String filename=its.getIPTimeRandName();
System.out.println("filename:"+filename);
// String filePath=this.getServletContext().getRealPath("/")+"files"+java.io.File.separator+filename;
//System.out.println("filePath:"+this.getServletContext().getRealPath("/")+"files"+java.io.File.separator+filename);
//java.io.File.separator是系统分隔符,win7是"\"这是将文件保存为什么名字
//保存在session中
if(!su.getFiles().getFile(0).getFileName().isEmpty()){
su.getFiles().getFile(0).saveAs(this.getServletContext().getRealPath("/")+"files"+java.io.File.separator+filename);
//在这里要保持所有上传的文件名,跳转到界面显示,任何用户都可以读到和保存
//选用application保存
//先把上传的文件名保存在集合中,集合保存在application中
ArrayList list=(ArrayList)this.getServletContext().getAttribute("list");
list.add(filename);
//更新在application中
this.getServletContext().setAttribute("list", list);
}else{
request.setAttribute("message", "0");
}
} catch (Exception e) {
// TODO Auto-generated catch block
// e.printStackTrace();
if(e.getMessage().indexOf("1010")!=-1){
request.setAttribute("message", "1010");
}else if(e.getMessage().indexOf("1105")!=-1){
request.setAttribute("message", "1105");
}
}
}