博客链接:Cs XJH’s Blog
当下的业务中往往有文件上传等需求,那么笔者今天就来谈谈文件上传服务器的相关操作。
文件的存储路径
你或许对这个标题感觉到奇怪,不是随便找个合适目录下存储文件就完事了么,难道存储路径也有门道?
是的,网上有很多关于文件上传存储的教程。其中,大部分推荐的文件存储路径都类似2020/1/31/qwertyuiopasdf.jpg。那么,你想过为什么要以这样的路径存储么?
我认为原因有二:
- 显而易见,使用上传日期作为文件存储的路径,不仅逻辑一目了然,而且有利于今后清除一些历史悠久的文件,为服务器腾出必要的硬盘空间,提高利用率。比如:用户一周或一个月前聊天记录中的图片。
- 根据操作系统相关知识,如果将所有文件都存储在单个目录下,文件越积越多,那么该目录下文件的访问速度将不断下降。所以,将文件分目录存储,一定程度上可以缓解这个问题。
文件的唯一性存储
对于刚入门的读者而言,保证文件在服务器上存储仅有一个副本,听起来匪夷所思,但这常常是作为一个后端攻城狮所必须要做的。
其实这个实现起来并不困难。首先,我们都知道文件上传是通过二进制传输,当文件上传后,我们可以得到文件的二进制数据集。其次,相信大部分读者都使用过md5加密,简而言之就是,对于不同的数据集可以得到不同且唯一的加密字符串。
如此,通过对文件的二进制数据集进行md5加密得到的加密字符串即可以唯一的标识一个文件。将该加密字符串存入数据库中,如果上传的文件加密后的字符串在数据库中已存在,那么说明该文件存在数据库,否则,不存在。或许,对于这个逻辑你还听过它的另一个名字,一键上传。
文件的命名
要保证目录下的文件命名不重复,其实,上面已经给出了一个很好的解决方案,就是使用文件的md5加密值作为文件的命名。
当然,也有一些其他的命名方式,比如:“文件名 + 当前unix时间戳”等,同样也是一个不错的选择
数据库中文件url存储
对于这个的处理,有一部分人选择存储文件的全路径,即:http://xxx/yyy/zzz.jpg,但更多的人则选择存储部分路径,即:2020/1/31/abcdefghijk.jpg。
而笔者认为,为了项目的可扩展性考虑,第二种方式才是上上之选。因为如果想为项目提高访问速度,那么像文件这样的静态资源访问一定是瓶颈之一。所以,为了提高静态资源的访问速度,必然会考虑CDN提速。当你把服务器上的静态资源转移之后,如果数据库的存储的是http://xxx/yyy/zzz.jpg这样的路径,那么你将有的忙了,~偷笑
以上,便是个人对文件存储相关的见解,如有不同观点,欢迎下方留言,一起探讨。
1631

被折叠的 条评论
为什么被折叠?



