将图片上传并存储到服务器

Upload & store images to the server

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

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

第一个建议是:

Do not store the actual path to database. Better to store the image's sequence number to database and have function that can generate path from the sequence number. e.g:

File path = generatePathFromSequenceNumber(sequenceNumber);

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

For the following reasons, I'm planning to use base64 encoded images to send as json to the back end:

  • It is only for profile images with limited file size up to 150kB (my webapp doesn't deal with images further than that at this point);
  • The simplest solution for web browser compatibility;

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

我强烈建议您在这里重新考虑您的计划。如果您存储编码图像,您就是在浪费磁盘 space 并且除非您先对其进行解码,否则您将无法对图像进行任何操作。

This may be a stupid question, but how do I derive a sequence number from a base64 encoded string?

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

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

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

但是,我不会直接获取序列号并将其变成递增路径,而是会生成一个散列或表示图像的半随机的东西并将其用于路径(如果不是散列,那么也许一个随机的十六进制字符串,或一个 UUID)。

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

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

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

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