【问题标题】:Storing user-uploaded files on a webserver在网络服务器上存储用户上传的文件
【发布时间】:2011-12-17 00:11:49
【问题描述】:

我正在开发一个允许用户上传文件(图片和其他)的网站。我在这方面没有任何经验,并希望获得一些关于存储和索引这些文件的正确方法的输入。

虽然我希望有一个能够很好地扩展到大容量数据的架构,但我目前并不担心极高(facebook-、google-scale)的容量。

我正在考虑将文件存储在文件系统上

/files/{username}/

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

我之所以考虑为每个用户提供自己的表,是因为它是一种简洁而独特的方式,可以跨表分片数据,并在查找给定用户的文件时减少搜索时间。

【问题讨论】:

    标签: database file-upload filesystems webserver


    【解决方案1】:

    Matt H 的建议是一个好主意,如果您要实现的是每个用户级别的图像访问。但是,鉴于您的数据库存储空间有限,如您所说,以二进制数据存储图像效率低下。

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      这有帮助吗?

      【讨论】:

      • 确实有帮助。但是,有几个问题。目前,我们使用共享网络服务器,每个数据库限制为 1GB,因此将图片/文件作为 blob 存储在数据库本身中是不可行的。此外,将所有图片放在一个表中不会增加特定图片的搜索时间吗?我对每个用户的表的推理是,了解用户,我会知道要搜索哪个表,因此必须搜索较少的记录(将其视为基于 userid 的分片)。那没有意义吗?有什么我想念的吗?
      • 索引的大小会影响 SQL 执行,但一大组未索引的 blob 不会被注意到。但是,如果您没有空间,那将是一个有争议的问题。在这种情况下,您需要将它们存储在文件系统中。如果您有很多用户名/照片文件夹结构,则可以使用,因为避免单个文件夹中的文件数量过多是一种好习惯。我会放置一个 .htaccess 以避免直接访问(假设您需要身份验证才能访问它们),并使用 photo?id=whatever 将标题更改为 image/jpeg 或其他任何内容,并回显 readfile 的图像。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 2016-01-19
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多