上传文件时避免文件夹或文件同名覆盖的一个方法
2009-06-17 23:57
567 查看
现在做的是一个OA系统,即办公自公化系统。在这个系统中,有一个个人文件柜和共享文件柜的功能模块。这两个模块的设计思想是这样的:个人文件柜仿网盘的样式,可以参考的有网易网盘和QQ网盘。在网易网盘中,同名问题的处理是,文件夹提示重名,而文件则是遇同名则自动再文件名后,后缀前补(0);QQ硬盘也类似,都是这样一套的防止同名覆盖的方法。
就个人文件柜,防止同名覆盖。 我设想的方法有两种:第一种就是设计数据库时,文件夹的数据库除了文件夹的路径,文件夹的显示名以外,还有一个字段为服务器硬盘上实际的文件名。在list和其他页面显示时显示的是显示名。文件也是这样的设计方式,即名字分显示名和存储名两种。比如在下载页面,我做的下载页面是用文件名做为标识,从服务器进行下载的,这个时候就是在下载页面上,用的是显示名,这是个链接,点击触发一个action,这个时候传给这个action的名字则是存储名。存储名的生成方式可以有很多,比如在文件名的前面加当前时间,可以精确到天,也可以精确到秒;还可以在文件名前加由数字和字母组成的随机字符串,随机字符串在我的一篇博文里有生成方式。这是一种防止同名覆盖的有效方法。需要注意的是用随机字符串最好size长一些。如果足够长(我觉得6位以上就很够了),再加上同名的概率本来不是十分大,这样的话,同名的机率可以聊到无限接近零。
还有一种就是同名判断。一般的OA系统几乎所有功能都跟工作流,用户表和角色表发生关系,文件柜虽然没有工作流,但是和用户表(文件柜的所有者)和角色表(文件柜的共享)发生着关系。如果我们进行同名判断,首先获得私人文件柜所有者的ID,因为每个用户都有一个属于自己的D:\privateCabinet\userId的文件夹,获得这个文件夹的ID;然后在文件表中进行条件查询,将所有folderId(外码)为上述文件夹Id的文件查询出来,并且存到list中。然后用一个for循环,循环地将上传文件的文件名与上述各文件记录的文件名进行比较,进行一个模糊的比较,如果发现有两个模糊匹配,我们就将第三个文件命名为文件名(3).后缀。这样的话,数据库就不用多一个字段,但是如果有好多个文件,系统的效率就会有所降低。
综合一下,第二种方法可以将同名覆盖的概率降到0,但是在文件记录比较多时,将会牺牲系统的效率;第一种方法可以将同名覆盖的概率降到接近于0,如果随机字符串的长度大到和uuid的长度一样,或者附加的时间精确到毫秒,同名覆盖的概率也可以将到无限接近于0,且这种方法没有牺牲效率的问题。
就个人文件柜,防止同名覆盖。 我设想的方法有两种:第一种就是设计数据库时,文件夹的数据库除了文件夹的路径,文件夹的显示名以外,还有一个字段为服务器硬盘上实际的文件名。在list和其他页面显示时显示的是显示名。文件也是这样的设计方式,即名字分显示名和存储名两种。比如在下载页面,我做的下载页面是用文件名做为标识,从服务器进行下载的,这个时候就是在下载页面上,用的是显示名,这是个链接,点击触发一个action,这个时候传给这个action的名字则是存储名。存储名的生成方式可以有很多,比如在文件名的前面加当前时间,可以精确到天,也可以精确到秒;还可以在文件名前加由数字和字母组成的随机字符串,随机字符串在我的一篇博文里有生成方式。这是一种防止同名覆盖的有效方法。需要注意的是用随机字符串最好size长一些。如果足够长(我觉得6位以上就很够了),再加上同名的概率本来不是十分大,这样的话,同名的机率可以聊到无限接近零。
还有一种就是同名判断。一般的OA系统几乎所有功能都跟工作流,用户表和角色表发生关系,文件柜虽然没有工作流,但是和用户表(文件柜的所有者)和角色表(文件柜的共享)发生着关系。如果我们进行同名判断,首先获得私人文件柜所有者的ID,因为每个用户都有一个属于自己的D:\privateCabinet\userId的文件夹,获得这个文件夹的ID;然后在文件表中进行条件查询,将所有folderId(外码)为上述文件夹Id的文件查询出来,并且存到list中。然后用一个for循环,循环地将上传文件的文件名与上述各文件记录的文件名进行比较,进行一个模糊的比较,如果发现有两个模糊匹配,我们就将第三个文件命名为文件名(3).后缀。这样的话,数据库就不用多一个字段,但是如果有好多个文件,系统的效率就会有所降低。
综合一下,第二种方法可以将同名覆盖的概率降到0,但是在文件记录比较多时,将会牺牲系统的效率;第一种方法可以将同名覆盖的概率降到接近于0,如果随机字符串的长度大到和uuid的长度一样,或者附加的时间精确到毫秒,同名覆盖的概率也可以将到无限接近于0,且这种方法没有牺牲效率的问题。
相关文章推荐
- springmvc Excel文件上传,使用ajaxSubmit方法进行文件上传,使用弹出层弹出一个框(jquery layer),点击进行下载
- ASP.NET 中将文件上传到另外一个服务器的方法
- 封装ThinkPHP的一个文件上传方法实例
- Python解决创建新文件时避免覆盖已有的同名文件问题
- pureftpd无法上传、新建、覆盖文件的解决方法
- php关于一个文件夹所有的文件复制到另一个文件夹里面去,相同的文件名覆盖
- 一个广告轮播系统的例子(内含文件上传的方法)
- php读取出一个文件夹下所有文件的方法示例
- 当网站不允许上传asp cer cdx htr文件时的一个解决方法
- Properties 类使用Store方法时 避免 覆盖以前Properties 文件的内容
- ANT使用 - 用for和foreach的方法遍历一个文件夹,查找到某个文件并删除
- 查找一个文件夹下指定后缀名文件的java方法
- 当网站不允许上传asp cer cdx htr文件时的一个解决方法!
- 将一个文件夹中所有的bmp文件转化成同名的jpg文件
- Spring MVC 中文件上传/删除 删除空文件夹方法 + 下载方法
- 一个简单的excel文件上传到数据库方法
- 在C#.net中做页面上传的程序。用Dhtml的控件:(创建文件上载控件,该控件带有一个文本框和一个浏览按钮。)和类HtmlInputFile的两种方法
- sql server 关于表中只增标识问题 C# 实现自动化打开和关闭可执行文件(或 关闭停止与系统交互的可执行文件) ajaxfileupload插件上传图片功能,用MVC和aspx做后台各写了一个案例 将小写阿拉伯数字转换成大写的汉字, C# WinForm 中英文实现, 国际化实现的简单方法 ASP.NET Core 2 学习笔记(六)ASP.NET Core 2 学习笔记(三)
- wordpress上传文件自动重命名的方法-原创-避免中文乱码
- Ant步步为营(5)用for和foreach的方法遍历一个文件夹,查找到某个文件并删除