转载声明:文章来源:https://blog.csdn.net/vb2005xu/article/details/52539165
任务分析:
1. 对网站中所有上传的文件提供一个独立的管理界面
2. 对上传的文件类型做区分,不同的文件类型提供不同的处理方案
1. 文件类型: [限定可上传的文件类型,诸如: jpg,gif,rar,pdf 等等的格式]
2. 不同的文件类型其存放目录不一样
3. 数据表记录
附件的原始名称,文件类型,上传/替换时间,被引用位置,提示文字等等
4. 交叉引用的删除管理方案 [待讨论]
与所属模块[比如文章]绑定,文章删除时将删除所属附件
优点: 节省服务器上的存储空间
缺点:
1. A,B页面都引用了隶属A页面的某个附件,当A页删除时,B页面存在数据缺失的问题
2. 要与所有需要上传功能的模块[比如文章]进行集成,要增加额外的数据库表和逻辑控制代码
2. 不与所属文章绑定,由管理员手动删除
优点: 不容易由程序造成数据缺失,模块独立化
缺点: 增加服务器上的存储空间
3. 可控模式下的半自动管理[这个是整理出来的解决方案]
设计思路:
1. 使用两张数据库表实现
attach {id,name,ref_count,store_path,raw_name,alter,ftype,fsize,create_at}attachref {rid,attach_id}
2. 使用一个计数器来计算附件的被引用次数,附件上传时该计数器为0,每当附件被引用时自动对计数器加1.比如在A页面中加入一张已经被上传的图片,则向数据库表中的该图片所对应的 计数器做+1运算,删除时-1.
3. 如果模块需要上传功能,则要实现程序定义的接口xser_iupload.要求实现唯一的attachref.rid.
例如:
1. 当在A页面中加入一张已经被上传的图片附件时此时并不会立即提交到后台,而是附加到当前表单中,并动态生成一个表单隐藏字段attachref,其值是以逗号分隔的附件id集合.
2. 数据提交到后台,程序生成唯一对应于A页面的attachref.rid,此时对表单隐藏字段attachref中的值进行分解,对attach表中的ref_count字段做+1运算,对attachref表做插入操作.
3. 当对A页面做删除操作时,要求在最后调用xser_iupload的数据清理函数,根据对应的attachref.rid查找attachref表中所有的attach_id,并删除,然后根据这些attach_id对attach表中的字段做-1运算.
4. 删除功能: 4中并不对数据进行真实的删除操作,只是管理交叉引用的问题
按上传时间查找删除,如果引用计数不为0则报提示
批量删除
喜欢这个老师的课