【问题标题】:Upload & store images to the server将图像上传并存储到服务器
【发布时间】:2015-03-02 16:31:24
【问题描述】:

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

  • 仅适用于文件大小限制为 150kB 以内的个人资料图像(我的 web 应用程序此时不会处理更多图像);
  • 最简单的网络浏览器兼容性解决方案;

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

第一个建议是:

不要存储数据库的实际路径。更好地存储图像的 序列号到数据库并具有可以生成路径的功能 从序号。例如:

文件路径 = generatePathFromSequenceNumber(sequenceNumber);

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

【问题讨论】:

  • 您需要将图像存储到服务器的内容

标签: php image storage


【解决方案1】:

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

使用三层树也是一个不错的建议。

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

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

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

顺便说一句,w.r.t.您的 base64 编码,我们改为从用户那里获取有关图像的数据,而不是上传图像。我们在 iframe 中执行实际上传。这不是最令人愉快的,但它允许我们直接上传图像而不会膨胀编码,同时仍然更新表单并在主窗口中响应用户。我相信存在可以为您做这种事情的库,我现在不记得我们使用了哪个库。

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

【讨论】:

  • 感谢您的有用建议!
  • 哈哈,还在笑mao,找办法转换base64。谢谢,我明白了你的逻辑,这很有意义。为了上传图片,我仍在研究不同的选项。如果我能找到一个具有通用解决方案的跨浏览器库,那就太好了。
【解决方案2】:

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

  • 仅适用于文件大小限制为 150kB 以内的个人资料图片(我的 web 应用程序目前无法处理更多图片);
  • 最简单的网络浏览器兼容性解决方案;

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

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

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

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

【讨论】:

  • 嗯,好的。我正在开发一个带有 REST 接口的纯 JavaScript 应用程序;似乎可以使用formdata提交文件,但IE9不支持。该死的,这是记录中的 id……我完全没听懂!
  • @KimGysen 即使您要使用 base64 进行传输,我仍然会将原始二进制文件存储在磁盘上以提高灵活性。如果您有一个特殊用例,其中 base64 对优化有意义,您可以这样做,但这将是一个非常特殊的情况。您的 API 可以返回图片的 URL。
  • 所以如果我理解正确的话,我能做的就是上传base64路径,然后在服务器上解码?抱歉补充问题。
  • @KimGysen 是的,完全正确。不过,我不会一开始就上传 base64……文件上传对用户来说往往特别慢,增加 33% 的开销而没有真正的好处并没有多大意义。但是,如果您必须这样做,那么可以在服务器端解码 base64 并存储真正的二进制文件。
  • 我会检查替代选项。感谢您的建议!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 2011-11-18
  • 2014-05-09
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多