|
本帖最后由 qldsrx 于 2016-6-27 18:06 编辑
前言:本人早期用.NET写过一个文件上传下载服务类,这是java的翻译版,并做了一些改进。图片也是文件,自然也包括,对于图片还有特殊处理,可以记录宽高以及显示时的图片压缩等,尚未添加,目前只是对通用文件进行了处理。代码是基于MYSQL数据库的,换其它数据库的话,代码里微调下即可,将SQL语句更换掉,并将代码中出现的mysql关键字改掉。
建表脚本:
- CREATE TABLE `sysfiles` (
- `QUID` INT(11) NOT NULL AUTO_INCREMENT,
- `HASH` CHAR(32) NOT NULL COMMENT '文件指纹',
- `SERVERFILE` VARCHAR(255) NOT NULL COMMENT '服务端文件',
- `CATALOG` VARCHAR(20) NOT NULL COMMENT '文件分类',
- `LENGTH` INT(11) NOT NULL COMMENT '文件长度',
- `HITS` INT(11) NOT NULL COMMENT '引用计数',
- `MODIFYDATE` DATETIME NULL DEFAULT NULL COMMENT '最后修改日期',
- `FILETYPE` VARCHAR(10) NULL DEFAULT NULL COMMENT '文件类型',
- `WIDTH` INT(11) NULL DEFAULT NULL COMMENT '图片宽度(像素)',
- `HEIGHT` INT(11) NULL DEFAULT NULL COMMENT '图片高度(像素)',
- `DLTIMES` INT(11) NULL DEFAULT NULL COMMENT '下载次数',
- PRIMARY KEY (`QUID`),
- INDEX `HASH` (`HASH`) USING HASH
- )
- COMMENT='文件信息表'
- COLLATE='utf8_general_ci'
- ENGINE=InnoDB;
复制代码 说明:这是一张独立的文件信息存储表,都有列说明,应该可以看得懂意思。当文件上传后,默认“引用计数”为0,当对应的业务数据保存到数据中后,对该表主键QUID添加引用时,更新HITS+1,允许同一个文件被多条记录引用,且同一个文件如果多次上传,由于HASH相同,不会产生多个文件,除非你指定不同的文件分类。这里文件分类可以理解为文件类型的分类,或者传递表名,每个数据表一个分类。DLTIMES是对文件的下载做统计用的,当文件下载链接中带有参数download=1时,将产生下载信息,记录一次下载。
未实现功能:图片的宽度和高度存储和图片显示时指定宽高产生缩略图,这在.NET里面已经实现,但JAVA初学,一些类库还不熟悉,且时间紧张,就先完成这么多了。
类库说明:
1、实现了文件重复上传判断,避免在服务器端产生过多垃圾文件。如果自行维护好HITS(引用计数),还可以对超过1天且引用计数为0的文件做删除处理(也可以指定对某个分类下面才处理)。删除时需要遍历数据行,到文件系统里删,然后再删除对应的数据库记录。这部分很好实现,就不写了。另外还可以利用JavaScript在客户端先计算文件的hash值,到服务端对比是否存在,以此实现文件的秒传,不过本人JavaScript功底还没到那么深,所以目前未实现该功能。
2、实现了文件的断点续传,断点续传是必须服务端和客户端同时支持才行,这里是服务端的功能实现了。
3、实现了文件的缓存,这其实也是断点续传所必须的要求,因为下次续传,会检查文件是否是上次的那个,不是的话,浏览器就自动放弃续传的。
4、实现的多浏览器判断中文下载文件名,避免中文乱码。
5、上传文件必须用流式传输,不支持multipart/form-data格式的表单数据,这是出于性能的考虑,因为表单数据到了后台,必须缓存了才能解析,这非常不利于服务器压力大的场合,会占用大量的服务器内存,且解析的开销也大。经测试,浏览器里通过ajax可以直接将文件数据流式传输到服务器中,而无需封装到form表单里。
6、可以设置文件上传的大小限制,默认限制4M文件,参数名limit,在函数FileUpload里面有一句“int limit = params.getIntValue("limit");”正是获取这个限制用的代码。这个limit参数可以在后台写死,也可以通过前台传递,你甚至可以扩展,让前台传递一个limit2的参数过来,结合后台的limit参数对比,取两者最小值以防止前台被黑,传递一个非法的限制值。
安全性:正常来说是没必要限制授权,如果需要,可以自行判断session里面是否有用户登录信息。无论是上传还是下载,都不会导致后台已有文件被删除或覆盖,安全性本身是有保障的。而且如果维护了HITS字段,你还可以定期清理HITS为0的文件。
前台示例:
可以结合这个帖子一起看:http://bbs.wex5.com/forum.php?mod=viewthread&tid=95887 ,第二个附件里加入了图片上传到服务器的功能。
注意,该类不可单独使用,需要结合上一个帖子中的附件资源一起:http://bbs.wex5.com/forum.php?mod=viewthread&tid=95857
2016-06-27,更新文件缓存识别算法。
|
评分
-
查看全部评分
|