服务器后端:如何为上传的文件生成文件路径?

时间:2013-12-17 09:27:54

标签: database design-patterns file-upload bigdata

我正在尝试创建一个网站,用户可以上传图片,视频和其他类型的文件。 我做了一些research,人们似乎建议将文件保存为数据库中的BLOB是个坏主意;相反,将文件路径保存在数据库中。

我的问题是,如果我将文件路径保存在数据库中:

1. How do I generate the file names?

我考虑过计算文件名的MD5值,但如果两个文件名相同怎么办?将用户名和时间戳等添加到文件名中?它甚至有意义吗?

2. What is the best directory structure?

如果用户在12/17/2013,12/18/201上传图片,我可以将其放入user_ABC / images /,然后创建带时间戳的子目录20131217,20131218等?所有这些东西的最佳结构是什么?

3. How do all these come together?

似乎维护这个系统真是太痛苦了,因为文件系统操作脚本与数据库操作紧密地耦合(可能还需要担心数据库事务?在我更新的一个事务中说数据库,但无法修改文件系统,所以我需要回滚我的数据库?)。

我认为这个系统无法扩展(如果我的机器用完了硬盘,那么我需要将文件上传到第二台机器?如果我的内容在群集上怎么办? )

我认为我真正的问题是:

4. Is there any existing framework/design pattern/db that handles this problem? 
What is the standard way of handling this kind of problems?

提前感谢您的回答。

2 个答案:

答案 0 :(得分:0)

当我为食品厨师设计一个社交网站时,我实际上已经问了同样的问题。我决定将图像的URL与配方一起存储在MySQL数据库中。如果您计划为一个食谱存储多个图像,在我的示例中,可能使用逗号分隔值。当页面上加载配方时,我会将与该配方相关的图像提取到屏幕上。

  1. 由于它是一个黑客马拉松而不是用于生产目的,我没有将文件名编码为独特的东西。但是,如果我是为了生产目的而开发的,我会在将它存储到服务器和数据库/后端时将时间戳附加到媒体文件名。

  2. 我相信我提出的是处理这种情况的最佳数据结构。将图像存储到服务器上不仅速度更快,而且还应占用更少的空间。我发现在将合理分辨率的标准jpg文件转换为base64编码时,编码的文本文件表示占用了30%的空间。当使用某种BLOB类型的数据格式而不是直接在服务器上存储文件时,还有编码文件和解码文件以进行存储和解析的时间。

  3. 使用像PHP这样的后端服务器脚本,您将能够利用您可用的信息做一些相当简洁的事情。从数据库中获取结果,然后使用HTML从页面加载。

  4. 据我所知,还没有从数据库中获取媒体的标准方法。也许会有一天。

答案 1 :(得分:0)

没有标准的方法,它与不同的应用程序不同。这个想法是你需要为每次上传生成一个不同的Path + FileName,这是一种方式:

HashId = sha1(microsecond + random(1,1000000));
Path = /[user_id]/[HashId{0,2}]/[HashId{-2}];
FileName = HashId