在网站上上传和存储图片的最佳方法是什么?


73

我不知道大型网站如何将图片保存在服务器上。谁能告诉我他们如何将用户上传的图片保存到数据库中?

我在想,也许他们只是将文件(图片)保存在某个路径中,然后将该路径保存在数据库中,对吗?

但是我想这样做。这是正确的吗?例如,一个名为的网站www.photos.com。当用户上传图片时,我将创建一个用户名文件夹,并将这些图片保存在该文件夹中。

我相信我们可以使用创建目录 php file concepts。因此,当新用户上传他的图片或文件时,我想用他的名字创建一个目录。

示例:如果用户名是john,我将在photos.com上创建一个像这样的目录 www.photos.com/john/,然后在他上传图片时将他的所有图片保存到该目录中。这是正确的方法吗?

我在这里没有人知道如何将文件保存到服务器,因此请让我知道如何执行此操作?我想以正确和安全的方式来做。


2
@AdrianCornish您能告诉我您尝试过的意思是什么吗?我不是要你为我写代码,我只是想要大多数人遵循的算法或过程,这样我才能知道该怎么做
niko 2012年

再次尝试了什么?您可以存储文件的路径,也可以将二进制数据存储在数据库中。您的实际问题是什么?
Adrian Cornish 2012年

您的问题用语不好-您正在询问如何上传图片。不是如何存储图片上传到您的网站。另外,您还采取了哪些措施来保护用户免受恶意代码的上传,带有隐藏有效载荷的图像,阻止人们只是从可索引的网址中抓取您的所有图像-Adrian
Cornish

1
“数据库”一词具有特殊含义。并且您误导了每个试图回答您问题的人。但是,这很糟糕,因为他们没有真正阅读问题
您的常识

1
@弗兰基抱歉,我不知道,但我接受了您的回答,也感谢您让我知道我非常感谢您的回答。弗兰基
niko 2012年

Answers:


211

所有大型网站都不会将图片保存到数据库中存储在磁盘中。他们将对图片位置的引用保存在表格中。然后从那里链接。

为什么?性能。

从数据库中提取大量内容是巨大的性能瓶颈。而且数据库不能很好地水平扩展,因此这将意味着更大的问题。所有大型网站都使用静态内容场来处理静态内容,例如图像。那些服务器不会关心您的身份。

您可能会问他们如何使照片真正保密?他们没有。

图片的链接本身就是地址和密码。让我们以Facebook为例。如果我在我的帐户上存储了私人照片,则您将无法打开它。但是,只要您有正确的地址就可以。

这幅画是私人的注意文件名
10400121_87110566301_7482172_n.jpg
(facebook会不时更改URL,因此链接可能会断开)

这不是顺序的。获取图片的唯一方法是知道它的地址。
根据上一张用户的照片,您无法猜测下一张。
它具有巨大的熵,因此,即使您开始进行随机的疯狂猜测,您也会遇到大量失败,而且,如果您确实看到了图片,那么您将无法从那里意识到所有者的身份,本身就是匿名保护。

编辑(为什么不应该将图像存储在“用户名”文件夹中:
编辑之后,很明显,您确实打算将文件放在磁盘上而不是在数据库上。此编辑涵盖了新方案。

即使您的逻辑(为每个用户创建一个文件夹)接缝更加有条理,当您开始拥有许多用户和许多图片时,它仍然会带来问题。假设您的服务器有1T磁盘空间。并让我们想象一下1T在服务器可以处理的负载上或多或少是准确的。

现在您有11个用户,假设他们同时开始上传,每个用户都将上传100GB以上的文件。当它们达到91GB时,每个服务器已满,您必须开始将图像存储在其他服务器上。如果遵循该用户/文件夹结构,则必须选择一个用户并将其所有数据迁移到其他服务器。此外,它对不能上传文件超过1T的用户进行了硬限制。

那我应该将所有文件存储在同一个文件夹中吗?
不,大型站点通常将文件存储在顺序文件夹(/ 000001 /,/ 000002 /等)中,每个文件夹的x定义文件数为x。这主要是针对文件系统性能问题。

有关目录中的文件过多的更多信息?


21
BRILLIANT的解释。正是我想要的东西,谢谢。
Cyber​​Junkie

2
谢谢弗兰基,这确实很清楚。但是还有另一种让我更有趣的方法:将图片存储在特定的图片存储提供程序上。
弗雷德(Fred)

1
@Fred绝对正确。该答案专门用于为不了解事物工作原理的人设置正确的心态。一旦您开始在您的网站上托管数百万张图片,您可能会想解决问题和/或外包托管这些资产。但是,心态保持不变。在数据库上,您仅引用图像位置。感谢您的评论。
弗兰基

8

将图像存储在数据库中通常是一个坏主意(如果您的网站很受欢迎)。传统上,数据库是大多数应用程序中的主要瓶颈之一。无需额外加载。如果图像在文件系统中,则许多http服务器(例如nginx)将最有效地为其提供服务。

俄罗斯最大的社交网络Vkontakte正是这样做的:将图像存储在文件系统中。

另一个大型社交网络实施了复杂的可扩展Blob存储。但是AFAIK无法向公众提供。

该答案的摘要:不要将blob存储在数据库中。


3

通过将图像物理上载到服务器,然后在数据库中记录文件位置和图像详细信息,可以最好地实现图像管理。随后,可以将搜索表单配置为允许用户进行文本搜索,零件编号搜索或其他查询。可以编写一个PHP脚本以根据表中找到的数据生成有效的HTML图像标签。

将图像上传到MySQL™BLOB字段是一个坏主意,如果图像比缩略图大得多,则此类图像数据通常会出现问题。如果图像很大,最终可能不得不一次复制/粘贴一个SQL INSERT语句(到phpMyAdmin中)。如果图像很大,并且文本编辑器将SQL INSERT语句分成两行,则您将永远无法还原图像。


3

这是正确的方法吗

是。
我唯一建议使用的不是名称,而是ID。
www.photos.com/albums/1234/对于初学者来说可以。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.