实现PHP文件上传器。一些基本的技术问题

时间:2010-12-10 07:20:11

标签: php file-upload filesystems

我目前正在处理文件上传器(类似于rapidshare),但规模很小。

  • 但是,我关心的一件事是如何组织文件?如果我将所有文件放在一个上传的目录中,很快(大约一个月),该目录中的文件数量将达到一百万。这会减慢我系统的速度吗?文件访问和查找会花费更多时间吗?我该如何解决这个问题?

  • 此外,我正在寻求实现多服务器上传。这意味着管理员可以选择可以上载文件的多个服务器。这将如何运作?用户是否会上传到我的服务器,我的服务器会立即通过FTP或其他机制上传到其他服务器吗?

  • 用户无法通过下载管理器下载文件。此外,普通用户不应支持恢复功能。我该如何实现呢。我可以为下载文件的用户提供直接文件位置访问吗?或者我是否必须使用脚本“提供”文件并 fopen,fread和print

感谢您的帮助,我非常感谢您的回答。

1 个答案:

答案 0 :(得分:4)

说实话,你似乎错过了一些实现类似描述系统所必需的重要经验。此外,“在非常小的范围内”肯定与不到一个月内的一百万个文件相矛盾。

我会尝试回答你的问题。

  1. 组织文件很大程度上是为了给他们合理的名字。如果您让用户选择文件名,请注意您正确过滤以阻止基于文件名的攻击,例如“../../../etc/passwd”(您应该理解这一点。)。我建议你使用哈希作为文件名。此外,您可以为它们分配公共“文件名”(实际上是通过数据库的别名)。上传后计算文件的哈希值。如果文件数量增加,您可以将它们存储在以哈希的前2个字符命名的目录中。这就是Git VCS所做的,我真的很喜欢。

  2. 你到底是什么意思?如果您计划拥有1个单上传服务器并将上传的文件镜像到其他服务器,则可以轻松分离这些进程。创建一个简单的上传页面并编写另一个发送文件的镜像脚本,例如:通过FTP到其他服务器。否则,如果您要创建一个称为集群的东西(多个Web服务器用于执行负载平衡和提供高可用性的相同目的),那么对于如何执行此操作没有简短的答案。许多聪明人赚了很多钱,因为他们拥有实施这些系统的必要经验和技能。如果你足够热衷于自己做这件事,你应该去阅读一些有关这方面的书。

  3. 我不想质疑你的动机,但为什么要阻止使用下载管理器?这些对于恢复中止的下载非常有用,因此有助于降低服务器的流量。它可以节省流量,带宽,能源成本和CPU时间。这对你来说太糟糕了吗?从技术上讲,您需要配置HTTP服务器,例如Apache,禁用简历。我不知道适当的选项是什么,但我认为有一个。或者,您可以通过PHP脚本提供文件,而不是直接链接到文件。该脚本通过URL参数获取文件的ID,并将该文件的内容(在本例中不能驻留在WWW根目录中)发送回客户端。这样,您自己有责任实现简历,因此您可以轻松地“禁用”它。如果您实际上要避免多次下载,我建议使用复杂的ID,如哈希(没有人可以猜测下载文件的链接),并实现一些脚本,在完成下载后删除文件。正如我所说,禁用下载管理器会伤害您和您的用户。

  4. 我希望这有助于全面了解您的想法的复杂性。