我正在编写一个允许用户将图像上传到服务器的应用程序.我希望每天大约有20张图片都是jpeg,可能没有编辑/调整大小.(这是另一个问题,如何在存储之前调整服务器端的图像大小.也许有人可以请求在评论中删除.NET资源等等).我现在想知道存储上传图像的最佳位置是什么.
将图像作为文件存储在文件系统中,并在表格中创建一条记录,其中包含该图像的确切路径.
或者,使用数据库服务器的"图像"或"二进制数据"数据类型将图像本身存储在表中.
我看到两者的优点和缺点.我喜欢a)因为我可以轻松地重新定位文件,只需要更改表条目.另一方面,我不喜欢在Web服务器上存储业务数据,我真的不想将Web服务器连接到任何其他保存业务数据的数据源(出于安全原因)我喜欢b)因为所有信息都是在一个地方,可以通过查询轻松访问.另一方面,数据库将很快变得非常大.外包数据可能更困难.
我通常将文件存储在文件系统上,因为它就是它的用途,尽管有例外.对于文件,文件系统是最灵活和最高效的解决方案(通常).
将文件存储在数据库上存在一些问题 - 文件通常比平均行大得多 - 包含许多大文件的结果集将消耗大量内存.此外,如果您使用使用表锁进行写入的存储引擎(例如ISAM),则您的文件表可能会被锁定,具体取决于您在那里存储的文件的大小/速率.
关于安全性 - 我通常将文件存储在文档根目录之外的目录中(不能通过http请求访问),并通过首先检查正确授权的脚本为它们提供服务.
选项B的唯一好处是在一个系统中拥有所有数据,但这是一个错误的好处!您可能会认为您的代码也是一种数据形式,因此也可以存储在数据库中 - 您希望如何?
除非你有一些独特的案例:
业务逻辑属于代码.
结构化数据属于数据库(关系或非关系).
批量数据属于存储(文件系统或其他).
没有必要使用文件系统来保存文件.相反,您可以在其上使用云存储(例如Amazon S3)或基础架构即服务(例如Uploadcare):
https://uploadcare.com/upload-api-cloud-storage-and-cdn/
但是将文件存储在数据库中是个坏主意.
Flickr使用文件系统 - 他们在这里讨论原因
我们已经让客户在几个不同的后端上坚持选项B(数据库存储)几次,我们最终总是回到选项A(文件系统存储).
像这样的大型BLOB即使是SQL Server 2005也没有得到足够好的处理,这是我们尝试过的最新版本.
具体来说,我们看到严重膨胀,我认为可能锁定问题.
另一个注意事项:如果您使用基于NTFS的存储(Windows服务器等),您可能会考虑找到一种方法将成千上万的文件放在一个目录中.我不确定为什么,但有时文件系统无法很好地应对这种情况.如果有人对此有更多了解,我很乐意听到.
但我总是试图使用子目录来解决问题.创建日期通常适用于此:
图片/ 2008/12/17/.JPG
...这提供了相当程度的分离,并且在调试期间也有所帮助.当存在真正庞大的目录时,资源管理器和FTP客户端都会有点窒息.
编辑:只是2017年的快速说明,在更新版本的SQL Server中,有许多新的选项可以处理大量的BLOB,这些BLOB应该避免我讨论的缺点.
我最近创建了一个PHP/MySQL应用程序,它将PDF/Word文件存储在MySQL表中(到目前为止每个文件大到40MB).
优点:
上传的文件与其他所有内容一起复制到备份服务器,不需要单独的备份策略(安心).
设置Web服务器稍微简单一点,因为我不需要上传/文件夹,并告诉我所有的应用程序它在哪里.
我开始使用事务进行编辑以提高数据完整性 - 我不必担心孤立和丢失文件
缺点:
mysqldump现在占用了很长的时间,因为其中一个表中有500MB的文件数据.
总的来说,与文件系统相比,内存/ CPU效率并不高
我称我的实现成功,它负责备份要求并简化项目的布局.对于使用该应用程序的20-30人来说,性能很好.
我知道这是一个老帖子.但是,此页面的许多访问者都没有与此问题相关.特别是对于新手.
如何在我们的网站上传和存储图像或文件:
对于静态网站,可能没有问题,因为某些共享托管的文件存储仍然足够.当问题变得更大时,问题来自动态网站.可以处理数据库中较大的数据,但是文件(例如图像)中的较大值会成为问题.网站中有两种类型的图像:
图像来自动态博客的管理员.通常,这些图像在上传之前已经过优化.
在用户的情况下来自用户的图像被允许上载诸如化身的图像.或者用户可以创建博客内容并从文本编辑器中放置一些图像.这种图像难以预测大小.用户可以通过调整视图大小但不调整图像大小来上传仅适用于小内容的大图像.
通过忽略项目号.上面的1,快速解决项目号.如果我们的网站没有图像优化功能,可以通过以下提示临时解决2:
不允许用户通过将文档重定向到图库来直接从文本编辑器上传.在此页面上,用户必须提前上传文件才能嵌入内容.此方法称为文件管理器.
使用裁剪图像功能供用户上传图像.即使用户上传非常大的文件,这也会限制图像大小.最终图像是裁剪图像的结果.我们可以在服务器端定义大小,仅接受500Kb或更低的大小.
现在,这只是暂时的.对于最终解决方案,重复问题:
如何处理大图像存储?
调整大小或更改扩展名.
大中型网站或电子商务如何处理图像的文件存储?
我们能做什么呢:
从托管VPS的共享迁移.不够?然后升级到Dedicated更高.
为文件存储创建自己的服务器.谷歌搜索做到这一点.这并不像你想象的那么困难.有些人为他们的网站做这件事.
简单的方法是使用CDN文件存储服务.
好的,1和2有点贵.但我认为不是最好的解决方案.
某些CDN服务允许您根据需要存储任意数量的Web文件.
问题,"如何从我们的网站上传文件到CDN?"
不用担心,一旦您注册,通常是免费的,您将获得如何上传文件并从/到您的网站获取链接的指导.您将获得API等等.这很简单.
一些提供商为我们提供14天的免费服务,存储和带宽有限.但这对于起点来说还可以.唯一的问题是因为"人们永远不会尝试".
希望它对新手有所帮助.
我在我的网站上使用上传的图像,我肯定会说选项a).
我强烈建议的另一件事是立即将文件名从用户命名的照片更改为更易于管理的内容.例如,具有唯一标识每张图片的日期和时间的东西.
它还有助于剥离用户的任何奇怪字符的文件名,以避免将来出现复杂情况.
绝对要调整图像大小,如果可以的话,检查它的格式.有些恶意文件被不知情的主机上传和提供服务 - 例如,GIFAR漏洞允许您在GIF文件中隐藏恶意Java小程序,然后可以在当前上下文中读取cookie并将其发送到另一个跨站点脚本攻击的站点.调整图像大小通常可以防止这种情况,因为它会对嵌入的代码进行调整.虽然这种攻击已经被JVM补丁修复,但是天真地提供二进制文件而不擦除它们会让你面临各种各样的漏洞.
请记住,大多数病毒扫描程序只能针对文件系统运行 - 如果将二进制文件存储在数据库中,则无法轻松地对其进行扫描.