文件上传之分目录存储及上传监听
2014-11-14 10:33
337 查看
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");
}
}
});
(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");
}
}
});
相关文章推荐
- LINUX目录和文件各自的权限说明,以及目录和文件权限之间的关系(应用:配置linux下上传图片的存储目录)
- centeros6.5使用openresty实现文件上传,并按不同时期存储在不同目录
- 解读分开存储网站程序文件和上传目录文件的方法_动易Cms教程
- flume实例二、监听目录日志上传到HDFS文件系统
- linux 软连接方式实现上传文件存储目录的无缝迁移
- Flume之监听目录变化并上传文件到HDFS中
- iOS文件处理,将图片存到手机目录里面 创建文件夹,NSFileManager用来存储图片,然后遍历将图片取出上传到服务器哦!!
- tomcat文件上传与存储(虚目录、临时存储)
- linux 软连接方式实现上传文件存储目录的无缝迁移
- 改变 OsCache 缓存文件存储目录
- 封装Ftp API函数,实现上传,下载文件,创建目录(Delphi)
- ASP.NET 2.0 - 如何把上传的文件保存到 服务器某个目录中
- 修改fckeditor使上传文件按用户id分目录存放,其上传图片加水印及缩略图
- [导入].net,C#,Ftp各种操作,上传,下载,删除文件,创建目录,删除目录,获得文件列表等
- 一个用FTP批量上传文件的perl脚本,支持目录上传
- 在服务端进行目录建立、删除,文件上传、删除的过程的php代码
- FCKeditor实现上传分月目录和文件重命名(C#)
- Asp.net文件上传 重命名 以及自动创建上传目录
- .net,C#,Ftp各种操作,上传,下载,删除文件,创建目录,删除目录,获得文件列表等
- .net,C#,Ftp各种操作,上传,下载,删除文件,创建目录,删除目录,获得文件列表等