我将托管用户提交的文件。我需要从文件中获取一些数据,然后将其移动到某个目录。
此文件的生命周期有两个兴趣点。第一个是抽象数据,第二个是文件存档时,可以共享。
当抽象数据时,我认为将文件重命名为独特的文件或将唯一的字符串附加到文件名以防止其覆盖其他现有文件。
当档案存档时,我想到了三种策略。一种是将从某个数据上传的所有文件保存在一个文件夹中。 (2006/9月/ 04,2008 / jan / 05)另一个是保留一个文件夹并继续填充它,直到我想要保留在文件夹中的一些最大数量的文件然后创建另一个(/ folder001 /,/ folder002 /, / folder003 /等。)。另一个是在达到某个阈值时创建子文件夹。所以像(/ j / jd / jde / jdelator)我在unix中看到过这个,不知道如何解释这个。
我遇到的问题是你们发现了哪些策略有用或使用过?
答案 0 :(得分:3)
在抽象数据时,我会选择以下内容:filename + millisec();
两个对millisec的调用不太可能是相同的,并且文件名在访问时更加用户友好。
如果您决定删除旧的和未使用的文件,则日期策略可以很方便:您只需要获取2006文件夹,并根据您的日志删除去年未访问过的所有文件夹。 这也可以为您的用户提供良好的指示,因为他们会知道它是否是新文件。 folderXYZ只是这一个的变种,用每个N个文件的标记替换日期。
阈值子文件夹可帮助您保持目录条目数较少,因此访问速度更快。请注意,当特定目录增长时,此解决方案有时需要移动文件(如果未映射则会中断某些URL)。
另一种可能性是使用具有与文件名位置相对应的UID的数据库,并通过http://server.com/UID/filename.txt访问文件。 这样,用户将文件保存为“filename.txt”,这对他来说很方便,并且您知道URL在哪里可以找到该文件(使用DB将UID转换为位置)。 请注意,UID可以是校验和(MD5,SHA-1)来处理同一文件的重复项。
答案 1 :(得分:2)
我在数据库中使用guid进行投票,然后使用Content-Disposition标头将其命名为原始文件名(如有必要)。我提倡的一件事是你使用的文件夹存储在web根目录之外;您不希望用户将文件上传到您的应用程序文件夹中。
答案 2 :(得分:1)
我使用了一个关系数据库,它将ID(int)标记为作为文件名称的uuids。这样它们在磁盘上的方式并不重要。它可以帮助我混淆文件。此外,我可以使用JOIN来任意“重命名”文件。另外,我可以使用不同的文件“名称”。这一切都取决于您的应用程序及其运行位置。
答案 3 :(得分:1)
虽然这取决于你的应用程序等,但我建议现在保持文件存储库方案非常简单,并在以后决定更精细的策略。换句话说,你做了一段时间的“管理混乱”;结构和策略将在稍后出现,届时您将了解所有要求和领域细节。通过保持简单,您可以轻松地改变一切。
无论如何,改变是不可避免的,你现在可以做的最好的事情就是选择某种策略并记录所有内容。