我正在写一个应用程序,允许用户以图像上传到服务器上。我期望大约20个图像,每天所有jpeg和可能未经编辑/调整。(这是另一个问题是,如何调整图像服务器上面前的储存。也许有人可以请在下降。净资源,在评论)。我现在不知道什么是最好的地点用于储存上传的图片。

  • 储存的图像作为一个文件在文件系统和创建一个记录表中的确切路径图像。

  • 或者,储存的图像自己在一个表中使用的"图像"或"二元数据"的数据类型的数据库服务器。

我看到的优点和缺点。我喜欢a)因为我可以很容易地重新定位的文件和只需要更改的表入境。在另一方面,我不喜欢储存业务的数据在网上服务器和我真的不想连接的网络服务器的任何其他数据源,拥有商业的数据(由于安全原因) 我喜欢b)因为所有的信息是在一个地方,并方便查询。另一方面,该数据库将会得到很大的很快。外包这些数据可以更加困难。

有帮助吗?

解决方案

我通常储存的文件在文件系统,由于这是什么地有用,但也有例外。对文件,该文件系统是最灵活和高效的解决方案(通常)。

有几个问题与将文件存储在一个数据库文件是一般的大得多的平均排-结果-设置含有多大的文件会消耗大量的存储器。此外,如果您使用的储存引擎,采用了表锁写(ISAM例如),你的文件表可能会被锁定往往根据尺寸/率的文件都存放在那里。

关于安全-我通常存储在一个目录中的文件之外的文件的根源(不可通过http请求),并为他们提供服务,通过一个脚本,用于检查的适当授权的第一次。

其他提示

唯一的好处对备选案文B是有所有的数据在一个系统中,但它是一个虚假的利益!你可能认为你的代码也是一种形式的数据,因此还可以储存在数据库怎么会你喜欢吗?

除非你有一些独特的情况下:

  • 业务逻辑所属代码。
  • 结构化数据所属数据库(关系或非关系).
  • 大量的数据属于储存(文件系统或其他)。

Files, Code, Data

这是没有必要使用文件系统中保持的文件。而不是你可以用云储存(如 亚马逊S3)或基础设施服务上(例如 Uploadcare):

https://uploadcare.com/upload-api-cloud-storage-and-cdn/

但是,将文件存储在数据库是一个糟糕的想法。

Flickr使用的文件系统,他们讨论的原因 在这里,

我们有客户坚持备选案文B(库存)几次在几个不同的后端,并且我们 总是 结束了回到备选案文A(文件系统储存)。

大Blob的喜欢,只是未经处理好了够的,甚至通过SQL服务器2005年,它是最新的一个,我们尝试过了。

具体地说,我们看到了严重的膨胀,而且我认为也许锁的问题。

一个其他的注意:如果您使用的是NTFS根据存储(windows服务器,等等)可能会考虑寻找办法把成千上万的文件中的一个目录。我不知道为什么,但是有时候该文件系统没有很好地应对这种情况。如果有人知道更多关于这个我爱听到它。

但我总是尽量使用子目录,打破了一点东西。创建日期的通常适用于这样的:

Images/2008/12/17/.jpg

...这提供了一个体面的水平隔离,并且还有助于在调试。资源管理器和FTP的客户都可以窒息一下,当存在真正巨大的目录。

编辑: 只是一个快速注意到2017年,较新版本的SQL服务器,都有新的选项,用于处理大量的斑点,都应该避免的缺点我讨论。

我们最近创建了一个PHP/MySQL应用程序,其中存储Pdf/Word文件在MySQL表(作为大为40MB每文件至今).

赞成:

  • 上载的文件复制备份服务器以及其他一切的,没有单独备份战略的需要(和平的头脑)。
  • 设立该网页的服务器是稍微简单的因为我不需要有一个上的文件夹,告诉我所有的应用程序在那里它是。
  • 我得到使用的交易记录的编辑,以提高数据的完整性-我不必担心成为孤儿和缺失文件

缺点:

  • 快照现在需要一个looooong时间,因为有500兆的文件数据的表格。
  • 总体而言不是很记忆/cpu有效的时相比,文件系统

我会叫我的执行取得了成功,它需要照顾的备份要求,并简化布局的项目。性能是罚款20至30人使用的应用程序。

我知道这是一个古老的职位。但是,许多游客到这个页面都遇到了什么有关的问题。特别是对于新手。

怎么上载和储存的图像或文件,在我们的网站:

为静态网站那里可能没有问题,因为该文件存于一些共托管仍然充足。问题来自一个动态网站,当它变得更大。大该数据库可以处理,但在更大的文件,如图像的是成为一个问题。有两种类型的图像,在一个网站:

  1. 图象来自管理为动态的博客。通常,这些图像已经优化之前的上载。

  2. 从图像中的用户的情况下,用户被允许上传的图像,如化身。或用户可以建立博客的内容,并把一些图像的文本编辑器。这种图像是难以预测的大小。用户可以上载大的图像只是小小的内容通过调整的图大小,但没有调整图像大小。

通过忽略项目。1所述,快速解决方案的项目。2可以临时解决由下列提示,如果我们没有图像的优化器的功能在我们的网站:

  1. 不允许用户直接上载,从文字编辑改变他们的图像的画廊。在这页用户必须上传文件之前他们可以嵌入内容。这种方法被称为一个文件管理。

  2. 使用作物的映像功能,用户上载图像。这将限制的图像大小,甚至用户上载非常大的文件。最终的图像的结果裁剪的图像。我们可以定义的尺寸在服务器方和接受只对例500kb或更低。

现在,这只是暂时的。为最终解决,该问题是重复:

  • 如何处理一个大图像存储?
  • 调整或变化的扩展。
  • 如何很大或中等的网站或电子商务处理文件的储存对于他们的图像?

我们能做些什么,然后:

  1. 迁移分享托管车辆定位系统。还不够吗?然后越高的升级到专用的。

  2. 创建你自己的服务器上的文件存储。谷歌上搜索这样做。这是不是像你想的那么难.有些人做他们的网站。

  3. 简单的方法是使用CDN的文件存储服务。

好吧,1和2是一点点贵。但是,没有3个我认为是最好的解决方案。

一些络服务能让你存储为许多网页的文件只要你想。

问"怎么上传文件,CDN从我们的网站?"

别担心,一旦登记,通常是免费的,你会得到指导,怎么上传文件,并得到他们的链接从你的网站。你会得到一个API多。这很容易。

一些供应商给我们一个免费的服务,为14天用有限的储存和带宽。但是,这将是好的起点。唯一的问题是因为人民从来没有尝试'.

希望这将有助于新手。

我用图像上传到我的网站和我肯定会说,选项a)。

其他一件事我强烈建议立即改变该文件的名字从我的用户名的照片,更便于管理。例如的东西的日期和时间,以独特的识别每个的画面。

它还有助于带用户的文件名称的任何奇怪的字符,以避免未来的并发症。

肯定调整的图像,并检查它的格式,如果可以的话。在有些情况下的恶意文件正在上传和服务通过不知情的主机,例如, GIFAR 漏洞允许你隐瞒一个恶意java程序在GIF文件,这将能够读饼干在目前上下文并将它们发送到另一个网站,用于交叉网站脚本的攻击。调整大小的图像通常可以防止这一点,因为它munges嵌入的代码。虽然这种攻击已固定由JVM贴片,天真地服务了二进制文件,而不洗刷他们打开你的整个范围的漏洞。

请记住,大多数病毒扫描仪可以只对文件系统的-如果你存储你的二进制文件的数据库中,你将不能够运行一个扫描仪对他们非常容易。

大多数实施选项A。

与选项B,你打开一整个大可能的whoop4ss当你马歇尔那些位从数据库中东西可以显示在浏览器上...此外,如果该数据库是下降的,不可用。

我不认为空间过多的一个问题...Tb驱动器是几百块钱现在。

我们正在执行与选项A,因为我们没有时间或资源来做选项B

自动调整,尽量imagemagick...它是用于许多主要的开放源码的内容/照片管理系统...我认为,也有一些。网的扩展。

有的排序的一种混合方法在SQL服务器2008叫 文件流数据类型 这是谈到了上 运行方式无线电#74, ,这是那种喜欢的两个最好的世界。大多数人没有2008年的otion,但是如果你这样做,这种选择看起来很酷

这基本上是我做的。

  1. 商店上载的图像临时目录或存储器。
  2. 流程图像之前的永久性存储。2.1.颜色更正 2.2.压缩 2.3.创建几份基于图像的尺寸 2.4.重新命名。xl.lg.md.sm等。缀
  3. 组所处理的图像的文件(从一个单一的文件)的一个文件夹内有文件夹,名为 id 这将存储在数据库的任何行/文件与 image file name (或者可以随机命名为图像名)。
  4. 创建 yyyy/mm/d path 文件夹,如果不存在。例如2016/08/21.记得这条道路和储存在数据库,用于同一文件和行。
  5. 移动图像 id 文件夹 path 文件夹。(路径文件夹也可以在位于/var/网络内容的文件夹。)
  6. 刷新记忆缓冲区或删除临时文件。

当你需要访问的任何图像中提及的一个文件中,你有路径和身份证的文件夹中包含的图像。例如 /var/web-content/{{path}}/{{id}}/image-file-name.sm.jpg

这种方式如果你必须删除所有已处理的图像文件,只是删除这个文件夹和它的内容。

我们使用A.我会把它放在一个共享驱动器(除非你不要计划在运行多个服务器)。

如果时间到来时这不会规模的对你那么你可以调查缓存机制。

绝对、积极的选择A。其他人已经提到,数据库一般不处理与Blob,无论他们是设计来这样做,或者不。文件系统,另一方面,生活于此的东西。你有选择使用RAID条,传播图像跨越多个驱动器,甚至扩展他们在地理上分散的服务器。

另一个优点是数据库的备份/复制将是可怕的。

选项A

一旦图像被装你可以验证的格式和调整之前保存。有一些。净的代码样本调整的图像 http://www.codeproject.com.例如: http://www.codeproject.com/KB/cs/Photo_Resize.aspx

由于安全原因,它也是最好的练习,以避免引起的问题 IE的内容嗅探 这可以允许的攻击者上传JavaScript内部的图像文件,这可能会得到执行的背景下你的网站。所以您可能想要改变的图像(作物/调整它们的大小)以某种方式之前把它们储存,以防止这种攻击。 这个答案 有一些其他想法。

嗯,我有一个类似的项目,用户将文件上传到服务器上。根据我的观点,选项a)是最好的解决方案,因为它更加灵活。什么你必须要做的是图像存储在一个受保护的文件夹分子目录。主要的目录必须由管理员设置作的内容必须没有运行的脚本(很重要)和(阅读、写)受到保护不被无障碍在http请求。

我希望这可以帮助你。

如果他们是小的文件,将不需要进行编辑,然后选择方案B并不是一个坏的选择。我喜欢这书写逻辑的文件存储和处理疯子目录结构问题。具有 很多 文件中的一个目录是坏的。emkay?

如果文件是大型或需要不断编辑,特别是从节目等办公室,然后选择一个是你最好的选择。

对于大多数情况下,这是一个优先事项,但是如果你去一个选项,只要重新该目录没有太多的文件。如果你选择选项B,然后作出的表与BLOBed数据可在它自己的数据库和/或文件的小组。这将有助于维护,尤其是备份/恢复。你的常规数据可能是相当小,同时图像数据将被 巨大的 随着时间的推移。

这取决于你的需求,特别卷,用户和频率的搜索。但是,对于中小型办公室,更好的选择是使用的应用程序喜欢苹果片或Adobe Lighroom.他们是专门的储存、编目、索引和组织这种资源。但是,对于大型组织,有强烈要求的储存和大量的用户,它建议化的一个内容管理plataform的数字资产管理,如Nuxeo或露天;两者都提供非常良好的资源管理非常大量数据的简化的方法以检索。而且,非常重要的:有一个免费的(open source)选择这两个平台。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top