上传&将图像存储到服务器

时间:2015-01-05 06:26:18

标签: php image storage

我正在寻找一种方法来在事件(活动)的文件系统上存储个人资料图像(传单) 由于以下原因,我打算使用base64编码的图像作为json发送到后端:

  • 仅适用于文件大小限制为150kB的个人资料图像(我的webapp不会处理此时的图像);
  • 最简单的Web浏览器兼容性解决方案;

到目前为止我找到的最佳答案(最热门的投票)是这一个: https://serverfault.com/questions/95444/storing-a-million-images-in-the-filesystem
由于可能有很多事件,随着时间的推移可能会有很多图像。

第一个建议是:

  

不要存储数据库的实际路径。最好存储图像   序列号到数据库并具有可以生成路径的功能   从序列号。 e.g:

     

文件路径= generatePathFromSequenceNumber(sequenceNumber);

从这个序列号,我将能够得到路径&要存储在我的数据库中的文件名 这可能是一个愚蠢的问题,但我如何从base64编码的字符串中导出序列号?

2 个答案:

答案 0 :(得分:1)

如果您采用该建议,序列ID可能是您创建的数据库中记录的关键。

使用三级树也是一个很好的建议。

然而,我不是直接获取序列号并将其转换为递增路径,而是如何生成散列或半随机代表图像并将其用于路径(如果不是散列,则可能是随机的)十六进制字符串或UUID)。

如果您将序列ID直接转换为编号文件名,如答案中所示,则在开始填充第二个目录之前,最终会将10000个文件写入第一个目录。我认为尝试在顶级目录中实现随机分布是个好主意。当您获得100万个文件时,为什么要支付读取跨目录的目录中1000个文件的全部成本(因为这就是所有将要使用的),而您可以将它们均匀地分布在所有叶子目录中。如果不出意外,它可以让您轻松地将树分布在多个文件系统上(可能是因为它们位于不同的服务器上)。

因此,在我自己的应用程序(工作中)中,键是UUID,因此,例如,我的第一个键可能是aa082512eeb64694a24c16601b4d9f05。然后将其放在aa0/825/aa082512eeb64694a24c16601b4d9f05.jpg中。我不确定该项目到目前为止有多少文件,但我们已经存储了2TB的图像(主要是1920x1080,不限于150KB文件)。

BTW,w.r.t。您的base64编码,我们将从上传图像中获取有关用户图像的数据。我们在iframe中执行实际上传。它并不是最令人愉快的,但它允许我们直接上传图像而不会使编码膨胀,同时仍然更新表单并在主窗口中响应用户。我相信有些图书馆会为你做这类事情,我现在不记得我们使用过哪一个。

我们的未来计划是添加功能检测代码,仅使用IE9的iframe,并在IE10,Chrome,Firefox等中使用更现代的东西。

答案 1 :(得分:0)

  

由于以下原因,我打算使用base64编码的图像作为json发送到后端:

     
      
  • 仅适用于文件大小限制为150kB的个人资料图片(我的webapp目前不再处理图像);
  •   
  • 最简单的网络浏览器兼容性解决方案;
  •   

请记住,存储base64编码数据的开销为33%。如果你有大量的项目,即使它们只有150KB,这也不是一件容易的事。 Base64也不是远程最简单的Web浏览器兼容性解决方案......原始的二进制映像是。

我强烈建议您在此重新考虑您的计划。如果您存储编码图像,则会浪费磁盘空间并阻止自己对图像执行任何操作,除非您先对其进行解码。

  

这可能是一个愚蠢的问题,但我如何从base64编码的字符串中获取序列号?

你不会。该序列号是图像数据库中的ID号。你有一个数据库,有关这些图像资产的额外数据,对吗?