起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3815|回复: 36

[分享] [更新]强大的文件处理服务类,绝对比官方的好

  [复制链接]

64

主题

471

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2016-6-25 19:12:42 | 显示全部楼层 |阅读模式
本帖最后由 qldsrx 于 2016-6-27 18:06 编辑

前言:本人早期用.NET写过一个文件上传下载服务类,这是java的翻译版,并做了一些改进。图片也是文件,自然也包括,对于图片还有特殊处理,可以记录宽高以及显示时的图片压缩等,尚未添加,目前只是对通用文件进行了处理。代码是基于MYSQL数据库的,换其它数据库的话,代码里微调下即可,将SQL语句更换掉,并将代码中出现的mysql关键字改掉。
建表脚本:
  1. CREATE TABLE `sysfiles` (
  2.         `QUID` INT(11) NOT NULL AUTO_INCREMENT,
  3.         `HASH` CHAR(32) NOT NULL COMMENT '文件指纹',
  4.         `SERVERFILE` VARCHAR(255) NOT NULL COMMENT '服务端文件',
  5.         `CATALOG` VARCHAR(20) NOT NULL COMMENT '文件分类',
  6.         `LENGTH` INT(11) NOT NULL COMMENT '文件长度',
  7.         `HITS` INT(11) NOT NULL COMMENT '引用计数',
  8.         `MODIFYDATE` DATETIME NULL DEFAULT NULL COMMENT '最后修改日期',
  9.         `FILETYPE` VARCHAR(10) NULL DEFAULT NULL COMMENT '文件类型',
  10.         `WIDTH` INT(11) NULL DEFAULT NULL COMMENT '图片宽度(像素)',
  11.         `HEIGHT` INT(11) NULL DEFAULT NULL COMMENT '图片高度(像素)',
  12.         `DLTIMES` INT(11) NULL DEFAULT NULL COMMENT '下载次数',
  13.         PRIMARY KEY (`QUID`),
  14.         INDEX `HASH` (`HASH`) USING HASH
  15. )
  16. COMMENT='文件信息表'
  17. COLLATE='utf8_general_ci'
  18. 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,更新文件缓存识别算法。

common.zip

4.88 KB, 下载次数: 416

评分

参与人数 2威望 +35 收起 理由
ysk007 + 15 很给力!
Masion + 20 起步把他收了吧

查看全部评分

171

主题

599

帖子

2466

积分

金牌会员

Rank: 6Rank: 6

积分
2466
QQ
发表于 2016-6-26 06:14:58 | 显示全部楼层
response.setContentType(MimeTypes.GetMimeType(filename));文件复制后,提示无法解析MimeTypes
轻量化ERP--企业邦  网址:meiprocess.cn
qq:8269301
手机:13801998595
回复 支持 反对

使用道具 举报

64

主题

471

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
 楼主| 发表于 2016-6-26 08:13:07 | 显示全部楼层
ysk007 发表于 2016-6-26 06:14
response.setContentType(MimeTypes.GetMimeType(filename));文件复制后,提示无法解析MimeTypes ...

已更新附件,请重新下载,那个是自定义的类,忘记添加了
回复 支持 反对

使用道具 举报

212

主题

1208

帖子

2225

积分

金牌会员

Rank: 6Rank: 6

积分
2225
QQ
发表于 2016-6-26 09:17:17 | 显示全部楼层
高手,支持分享
WEX5初学者,欢迎初学者交流
QQ:597558229
tel:15857336322
回复 支持 反对

使用道具 举报

212

主题

1208

帖子

2225

积分

金牌会员

Rank: 6Rank: 6

积分
2225
QQ
发表于 2016-6-27 16:25:26 | 显示全部楼层
怎么使用的啊
WEX5初学者,欢迎初学者交流
QQ:597558229
tel:15857336322
回复 支持 反对

使用道具 举报

64

主题

471

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
 楼主| 发表于 2016-6-27 16:31:41 | 显示全部楼层
本帖最后由 qldsrx 于 2016-6-27 16:32 编辑

你前面看都没看,用都没用就回复了吗?

把附件里面的文件,解压缩到common目录下面,和之前分享的数据库SQL参数解析类一样,放一起。其实你打开那个.java文件,看下包名就知道应该放哪个目录了。之后就直接编译使用即可。

而前台js文件也没多少文字,打开看下就知道请求的url地址和参数的写法了。

我的作品的特色是,短小精悍,阅读轻松
回复 支持 反对

使用道具 举报

212

主题

1208

帖子

2225

积分

金牌会员

Rank: 6Rank: 6

积分
2225
QQ
发表于 2016-6-27 16:36:05 | 显示全部楼层
qldsrx 发表于 2016-6-27 16:31
你前面看都没看,用都没用就回复了吗?

把附件里面的文件,解压缩到common目录下面,和之前分享的数据库S ...

不是没看,是没看懂,基础差
WEX5初学者,欢迎初学者交流
QQ:597558229
tel:15857336322
回复 支持 反对

使用道具 举报

212

主题

1208

帖子

2225

积分

金牌会员

Rank: 6Rank: 6

积分
2225
QQ
发表于 2016-6-27 16:52:36 | 显示全部楼层
本帖最后由 郭德成 于 2016-6-27 17:25 编辑

我下载了mysummernote.js和common文件夹,我将mysummernote.js放到ui2/third/summernote/js/下面,然后将common解压的三个文件复制到baas/common文件夹下了,在W页面上,也引入了require("$UI/third/summernote/js/mysummernote");,然后在w页面里放了textarea,并自定 义了属性bind-summernote,指向了相应的数据库字段(数据库都连通了的,可以显示字段),但页面上没有出来富文本编辑框,另外,我要能正常上传图片,还要怎么做?
WEX5初学者,欢迎初学者交流
QQ:597558229
tel:15857336322
回复 支持 反对

使用道具 举报

64

主题

471

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
 楼主| 发表于 2016-6-27 16:56:19 | 显示全部楼层
郭德成 发表于 2016-6-27 16:52
我下载了mysummernote.js和common文件夹,我将mysummernote.js放到ui2/third/summernote/js/下面,然后将co ...

你引用的js名字错了,是叫mysummernote,而不是summernote,虽然也有summernote,所以引用的时候不会报错,但没效果,这个是低级错误。
回复 支持 反对

使用道具 举报

212

主题

1208

帖子

2225

积分

金牌会员

Rank: 6Rank: 6

积分
2225
QQ
发表于 2016-6-27 17:20:26 | 显示全部楼层
我也 发现了,改了,也没出效果
WEX5初学者,欢迎初学者交流
QQ:597558229
tel:15857336322
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.   

GMT+8, 2017-10-20 05:45 , Processed in 0.207405 second(s), 31 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表