在Web服务器上存储用户上载的文件

时间:2011-10-28 03:17:03

标签: database file-upload filesystems webserver

我正在开发一个允许用户上传文件(图片和其他内容)的网站。我没有这个领域的任何经验,并希望得到一些输入正确的方式来存储和索引这些文件。

虽然我希望有一个可以很好地扩展到高容量数据的架构,但我目前并不担心非常高的(facebook,google-scale)卷。

我在考虑将文件存储在

的文件系统中
/files/{username}/

然后拥有一个数据库uploads,其中每个用户都有自己的表,其中包含他上传的每个文件的文件名(以及URL)(以及我可能想要存储的任何其他额外信息)。 数据库结束(给每个用户自己的表)对我来说效率非常低,但是保持单个表中所有文件的记录似乎不正确,并且每次单个文件时都需要搜索整个表。访问。

我考虑为每个用户提供自己的表后面的理由是,这是一种简洁明了的方法,可以在表格中对数据进行分片,并在查找给定用户的文件时缩短搜索时间。

2 个答案:

答案 0 :(得分:3)

这取决于您的应用和数据库的性质和结构。我使用了很多技术,包括基于文件夹,存储在数据库blob中的图片,通过身份验证网关访问的网络外文件夹......

对于与应用程序或数据库没有直接关系的外部图像,如临时照片或其他东西,我倾向于将它们放在一个文件夹中。由于您的结构看起来像是来自用户的图片,因此我希望可能存在与图像相关联的元数据,例如标签。在这种情况下,我可能会将图片存储在数据库表中,假设我有能力。如果照片需要保护,其他用户无法进行身份验证,则数据库将拥有自己的安全性,而基于文件的存储需要某种技巧来防止未经授权的访问。

我不会为每个用户使用一个表,只是一个包含ID,userid,picture blob元素的图片表。

这有帮助吗?

答案 1 :(得分:3)

如果您要实现的目标是每个用户级别的图像访问权限,那么Matt H提出的建议是个好主意。但是,如果您在数据库存储空间中受到限制,那么将图像存储在二进制数据中的效率就低于您所说的。

每个用户使用一个表是糟糕的设计。上传文件的用户应该只是表中存储所有文件上传的字段/列,以及任何文件元数据。我建议为文件名生成一个GUID,它保证是唯一的,并且比自动增量字段更好,如果你试图阻止用户只是访问所有图像,这个字段很容易猜到。

您担心性能问题,但在处理数百万条记录之前,您选择图像的查询属于用户,在特定时间范围内上传(比如存储时间戳或类似内容)是微不足道的成本。如果速度是一个问题,您可以在用户名上添加B树索引,这将显着加快您的用户特定图像查询。

回到安全性,访问和组织的主题。使用每个用户的文件夹存储图像(尽管根据用户数量,文件夹的数量可能会增长到难以管理的级别)。如果您不希望图像公开,请将它们存储在非Web文件夹中,让应用程序读取数据并对其进行流式处理以呈现用户的图像。更复杂,但你隐藏了互联网上的实际文件。此外,您还可以验证经过身份验证的用户对图像的所有请求。