database - 将用户上传的文件存储在网络服务器上

标签 database file-upload filesystems webserver

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

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

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

/files/{username}/

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

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

最佳答案

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

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

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

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

关于database - 将用户上传的文件存储在网络服务器上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7924765/

相关文章:

mysql - DECIMAL类型舍入额外的小数并且不截断mysql

ios - iOS 中的扁平化 Firebase 查询问题

php - 如何合并到数据库

mysql - 如何从 MySQL 中选择按创建日期和名称排序的标签,但删除重复的名称?

javascript - jQuery blueimp 文件上传 : Uploads N - 1 files to server in IE

c++ - 在 C++ 中上传图像文件

bash - 如何根据磁盘ID获取磁盘名称?

javascript - 使用 AngularJS 多部分表单数据将文件上传到 Google Cloud Storage

linux - Linux 中的文件输出重定向

windows - srv.sys 如何根据底层文件系统决定原始模式与核心模式?