SmartUpload上传文件解决重名的问题

工作中经常用到时间戳加上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");
				}
			}
		}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值