文件上传之分目录存储及上传监听

1.分目录存储
(1)同一文件夹下的文件不能重名,此时用UUID改造文件名,使文件名独一无二
String uuidname = UUID.randomUUID().toString()+"_"+filename;
*ie6在上传文件时,文件名有错误,上传是文件的硬盘路径,所以要单独进行处理
filename = filename.substring(filename.lastIndexOf("\\")+1);
(2)如果文件上传的目录不保护起来,用户可以上传任意的jsp文件,调用jsp文件执行任意代码,非常的危险,所以应该将文件上传目录和临时文件目录放置在WEB-INF目录下保护起来

(3)如果一个文件夹下文件过多,会导致访问非常的缓慢,应该将上传的文件分目录存储
可以根据:ip、上传时间、扩展名、文件大小、分目录存储
最优的解决方案:使用hashcode来分目录存储:
根据文件名生成hashcode值转为8为16进制表示形式,由于文件名不同算出的hashcode基本可以保证不会重复,再遍历这8位16进制数,每一位都生成1级目录,这样最终有8级目录,每一级中都有16个子目录,最终文件会随机分布在可能的4294967296目录中,这样无论何时都不会有过多的文件在同一个目录中。

2.文件上传监听

ServletFileUpload 类 提供 public void setProgressListener(ProgressListener pListener) 
* 为文件上传程序绑定一个监听器对象,通过监听器可以监听文件上传全过程 
* 和AJAX技术结合,编写文件上传进度条 

设置监听器,文件上传程序会自动执行 监听器中 update方法 public void update(long pBytesRead, long pContentLength, int pItems)

在方法中可以获得 文件总大小、已经上传大小和 上传第几个元素 

能否根据上面三个参数计算:剩余大小、传输速度、已用时间、剩余时间
1) 已用时间 = 当前时间 - 开始时间
2) 速度 = 已经上传大小/已用时间
3) 剩余大小 = 总大小- 已经上传大小

4) 剩余时间 = 剩余大小/速度

代码为:

<span style="white-space:pre">		</span>ServletFileUpload  fileUpload=new ServletFileUpload(factory);
		//添加监听器;
		final Long beginTime=System.currentTimeMillis();
		fileUpload.setProgressListener(new ProgressListener(){
			public void update(long bytesRead, long contentLength, int items) {
				System.out.print("总大小:"+contentLength+" 已上传:"+bytesRead+" items:"+items);
				//剩余字节数;
				long leftBytes=contentLength-bytesRead;
				System.out.print(",剩余字节数:"+leftBytes);
				//已上传百分比;
				BigDecimal bRead=new BigDecimal(bytesRead);
				BigDecimal bLength=new BigDecimal(contentLength);
				BigDecimal per=bRead.multiply(new BigDecimal(100)).divide(bLength,2,BigDecimal.ROUND_HALF_UP);
				System.out.print("已上传:"+per+"%");
				//已上传用时;
				Long useTime=(System.currentTimeMillis()-beginTime)/1000;
				System.out.print("已用时:"+useTime);
				if (useTime!=0) {
					//上传速度:read/usetime/1000
					Long speed = bytesRead / 1000 / useTime;
					System.out.println("上传速度:" + speed + "KB/s");
				}
			}	
		});


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值