虚拟主机网站的文件存储策略

时间:2020-03-05 18:58:05  来源:igfitidea点击:

我将托管用户提交的文件。我需要从文件中获取一些数据,然后将其移至某个目录。

在此文件的生命周期中,有两个兴趣点。第一个是对数据进行抽象时,第二个是对文件进行存档以便可以共享时。

提取数据时,我曾考虑过将文件重命名为唯一的名称或者在文件名中添加唯一的字符串,以防止其覆盖其他现有文件。

当文件要归档时,我想到了三种策略。一种是将所有从特定数据上传的文件保存在一个文件夹中。 (2006 / sept / 04,2008 / jan / 05)另一个是保留一个文件夹并不断填充它,直到我要保留在文件夹中的最大文件数量,然后创建另一个文件夹(/ folder001 /,/ folder002 /, / folder003 /等。)。另一个是一旦达到某个阈值,就创建子文件夹。就像(/ j / jd / jde / jdelator)一样,我在UNIX中已经看到了这一点,但不确定如何解释。

我的问题是,你们发现哪种策略有用或者有用?

解决方案

回答

我使用了一个关系数据库,该数据库将ID的(int)标记为文件名的uuid。这样,它们在磁盘上的状态无关紧要。它可以帮助我混淆文件。另外,我然后可以使用JOIN任意"重命名"文件。另外,我可以使用不同的文件"名称"。这完全取决于应用及其运行位置。

回答

尽管它取决于应用程序等,但我建议暂时保持文件存储库方案非常简单,然后再决定更详细的策略。换句话说,我们会暂时进行某种"受控的混乱"。当我们找到所有需求和特定领域时,将提出结构和策略。通过保持简单,我们可以轻松更改所有内容。

无论如何,改变是不可避免的,我们现在要做的最好的事情就是选择一些策略并记录所有内容。

回答

我会在数据库中对guid进行投票,然后在必要时使用Content-Disposition标头将其命名为原始文件名。我要提倡的一件事是,我们使用的文件夹存储在Web根目录之外。我们不希望用户将文件上传到应用程序文件夹中。

回答

当数据被抽象时,我会选择类似的东西:filename + millisec();
两次调用millisec的可能性不大,访问时文件名更易于使用。

如果我们决定删除旧文件和未使用的文件,则日期策略会很方便:根据日志,我们只需要获取2006文件夹,并删除去年未访问的所有文件。
这对于用户也可能是一个很好的指示,因为他们会知道该文件是否为新文件。
folderXYZ只是该文件夹的一个变体,用每N个文件的标签替换日期。

阈值子文件夹可将目录条目的数量保持在较低水平,因此访问速度更快。请注意,此解决方案有时需要在特定目录增长时移动文件(如果未映射,则打破一些url)。

另一种可能性是使用UID与文件名位置相对应的数据库,并通过http://server.com/UID/filename.txt访问文件。
这样,用户将文件另存为" filename.txt",这对他来说很方便,并且我们知道URL的位置(使用DB将UID转换为位置)。
请注意,UID可以是校验和(MD5,SHA-1)以处理同一文件的重复项。