在 web 应用程序中存储用户上传文件的最佳方式
Posted
技术标签:
【中文标题】在 web 应用程序中存储用户上传文件的最佳方式【英文标题】:Best way to store user-uploaded files in a webapp 【发布时间】:2011-02-12 14:21:00 【问题描述】:我正在创建一个 Web 应用程序(在 Django 中),它需要允许用户上传文件(特别是图像,稍后会显示给其他用户)。我正在尝试了解存储这些上传文件的最佳方式。
从相关问题中,我看到有人建议给文件一个服务器生成的 unqiue id,然后创建一个将 id 映射到原始文件名的数据库表。
从安全性、效率或任何其他角度来看,这是存储用户上传文件的最佳方法吗?我应该为每个文件存储什么样的信息?
在接受用户上传的文件方面是否还有其他最佳实践? (除了确保它们确实是图像并检查它们的大小之外,显然)?
编辑:关于我需要什么的更多信息。我说的是用户需要上传和嵌入到他们创建的内容中的图像文件。把它想象成 *** 的答案(或博客文章):有人上传了一张图片,只要其他人看到答案,就必须存储和显示。
谢谢, Edan注意:有几个相关的问题,但我没有找到一个要求比较存储用户上传文件的方法。
【问题讨论】:
嗨,edan,我遇到了同样的问题。我将创建用户可以上传图像/pdf 的应用程序。然后他们可以查看/下载文件。我正在考虑文件系统存储。只是想从您的经验中了解您更喜欢哪种方式? 我计划的方向是: 1. 保存“元”信息(原始文件名等)的数据库。 2. 文件系统上的物理文件,其名称是元信息数据库的索引。顺便说一下,每个数据库条目可以有多个物理文件,例如对应于不同的分辨率。例如,我将有文件:254_high_res.jpg、254_los_res.jpg,其中 254 是文件 254 元信息的数据库中的索引。 感谢伊丹。我将使用 radon guid 生成的名称作为文件名存储图像。对于不同的分辨率,我将使用处理程序。 dotnetslackers.com/articles/aspnet/… 【参考方案1】:您的问题过于宽泛,无法真正提供帮助;最佳方法将取决于您的具体要求。不过……
程序员总是想将文件插入数据库。抵抗。它只会给你之后尝试用它们做的所有事情增加一层复杂性。
根据我的经验,虽然使用哈希键作为本地文件名是我的偏好,但它并没有真正奏效,因为我们的文件不限于图像:非图像需要一个文件名才能返回给用户,并且上传者并不特别喜欢彻底重命名他们的文件,因为这使他们无法知道什么文件是什么。
至于图像,在重新缩放为各种尺寸/缩略图时需要做一些重要的工作。
【讨论】:
为什么有些人将文件放在数据库中?这似乎是一个非常糟糕的主意,但我听说过几次。它有什么好处吗?【参考方案2】:这是一个大问题。
与您的图片用例相关,这是图片服务器的域,通常是应用程序的完整独立部分。它们处理图像的生命周期和调整大小(一张图片被存储/调整为不同的大小)。据我所知,这从来没有通过 SQL 中的 BLOB 列实现,而是通过磁盘上的简单普通文件实现。
也看看 (infrastructure example from facebook)
通常,产品必须符合您的具体要求(文件大小、文件数量、负载)。在大多数情况下,您真的不想从头开始构建所有这些东西......虽然如果您的要求较低(只有少数用户很少上传文件),您可以将这些文件保存在磁盘上并将路径保存为参考您的其他数据(例如 RDBMS 中的列)。
【讨论】:
以上是关于在 web 应用程序中存储用户上传文件的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章
在 Web 应用程序中存储小型 UI 用户首选项的最佳方式? [关闭]
如何在从 Web 应用程序上传的服务器上存储 10 亿张图像? [关闭]