在Web应用中存储用户上传文件的最佳方法

28

我正在创建一个Web应用程序(使用Django),需要允许用户上传文件(特别是图片,稍后会为其他用户显示)。我正在尝试了解存储这些上传文件的最佳方法。

从相关问题中,我看到一些人建议给文件分配一个由服务器生成的唯一ID,然后创建一个数据库表,将ID映射到原始文件名。

从安全性、效率或任何其他方面来看,这是否是存储用户上传文件的最佳方法?我应该存储有关每个文件的哪些信息?

除了确保它们真的是图像并检查其大小之外,接受用户上传文件还有其他最佳实践吗?

编辑:关于我需要的一些更多信息。我具体说的是用户需要上传并嵌入他们创建的内容中的图像文件。想象一下像StackOverflow答案(或博客文章):有人上传了一张图片,每当其他人查看答案时都必须存储和显示。

谢谢,
Edan
注意:有几个相关的问题,但我没有找到一个比较存储用户上传文件方式的问题。


嗨Edan, 我碰到了同样的问题。 我要创建一个应用程序,让用户上传图片/ PDF 文件。 然后他们可以查看/下载文件。 我考虑使用文件系统存储。 只是想知道你从经验上更喜欢哪种方式? - Pragnesh Patel
1
我计划采取的方向是:1.一个数据库来保存“元”信息(原始文件名等)。2.物理文件存储在文件系统中,文件名是元信息在数据库中的索引。顺便说一下,每个数据库条目可以有多个物理文件,例如对应不同的分辨率。例如,我将拥有文件:254_high_res.jpg,254_los_res.jpg,其中254是数据库中文件254的元信息的索引。 - Edan Maor
谢谢Edan。我将使用生成的Radon GUID名称作为文件名来存储图像。对于不同的分辨率,我将使用处理程序。http://dotnetslackers.com/articles/aspnet/Generating-Image-Thumbnails-in-ASP-NET.aspx - Pragnesh Patel
2个回答

3
您的问题涉及范围太广泛,无法真正有助于解决问题;最佳方法将取决于您的具体需求。尽管如此...

程序员经常倾向于将文件拍入数据库。抵制这种做法。它只会给以后尝试使用这些文件带来复杂性。

根据我的经验,虽然在本地文件名中使用哈希键是我的首选,但结果并不理想,因为我们的文件不仅仅限于图像:非图像需要一个文件名以便向用户返回,而上传者不喜欢它们的文件被彻底重命名,因为这使得他们无法知道哪个文件是哪个。

至于图片,需要进行一些复杂的工作,以重新缩放到各种大小/缩略图。


为什么有些人会把文件放到数据库里?这似乎是一个非常糟糕的想法,但我听说过几次。它有任何优点吗? - Edan Maor

2
这是一个很大的问题。
与您使用图片的情况有关,这是图片服务器的领域,通常是应用程序的完全独立部分。它们处理图像的生命周期和调整大小(一个图片被存储/调整为不同的尺寸)。据我所见,这种实现从未通过 SQL 的 BLOB 列实现,而是通过普通的磁盘文件直接实现。
另外,请参考 Facebook 的 基础设施示例
一般来说,产品必须符合您具体的要求(文件大小、文件数量、负载等)。在大多数情况下,您真的不想从头开始构建所有这些东西...虽然如果您的要求较低端(只有少数用户偶尔上传文件),您可以将这些文件保存在磁盘上,并将路径保存为其他数据中的引用(例如 RDBMS 中的列)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接