base 64 图像 select 和从数据库编码时发现速度慢

Slowness found when base 64 image select and encode from database

我在离子框架中工作。目前正在设计一个包含文本和图像的 post 页面。用户可以post那里的数据和图像都是安全的。

因此,我使用 base 64 编码并将图像保存在数据库中。

encodeURIComponent($scope.image)

每次用户请求时,我 select 行来自 table 并将它们与文本一起显示并解码。

decodeURIComponent($scope.image) 

与 HTML "data:image/jpeg;base64,_______" 转换。

工作正常,但花费了我预期的那么多时间。因此,图像尺寸大了33%,并且看起来完全凸起。

然后我决定继续使用 cordova 的文件上传插件。但我意识到,以这种方式维护文件风险很大,而且很复杂。我也尝试将二进制数据保存到数据库中。但是失败了。

没有 base64 数据的文本 selecting 会大大减少时间。如果可以 select 在另一个 http 调用中单独显示图像,在 selecting 其他列并显示之后。它是处理安全图像的正确机制吗?

因为只是个人文件,你可以将它们存储在S3中。

为了保证文件上传的安全,无论您选择哪种存储方式,上传前只需检查文件的 MIME 类型。

http://php.net/manual/en/function.mime-content-type.php

只是 运行 快速检查上传的文件:

$mime = mime_content_type($file_path);
if($mime == 'image/jpeg') return true;

没什么大不了的!

将文件保存在数据库中是不好的做法,它应该是您最后的资源。 S3 适用于许多用例,但对于高使用率来说它很昂贵,并且本地文件应该仅用于 Intranet 和非 public 可用的应用程序。

我认为,去S3。

Amazon 的 sdk 易于使用,您将获得 1gb 的免费存储空间用于测试。 你也可以使用你自己的服务器,只是把它放在你的数据库之外。

在文件系统上存储图像的解决方案

假设您有 100.000 个用户,每个用户有 10 张图片。你如何处理本地存储? 问题: Linux 文件系统在几十万张图片后崩溃,因此你应该使文件结构避免这种情况

解法: 将文件夹名称设为 'abs(userID/1000)*1000'/userID

这样当您拥有 ID 为 989787 的用户时,它的图像将存储在该文件夹中 989000/989787/img1.jpeg 989000/989787/img2.jpeg 989000/989787/img3.jpeg

这就是一种为百万用户存储图像的方法,不会破坏 unix 文件系统。

存储大小如何?

上个月我不得不为我从事的电子商务工作压缩 130 万张 jpeg。上传图像时,使用具有无损标志和 80% 质量的 imagick 进行压缩。这将删除不可见的像素并优化您的存储。由于我们的图像从 40x40(缩略图)到 1500x1500(缩放图像)不等,我们平均有 700x700 张图像,乘以 130 万张图像,大约占用 120GB 的存储空间。

是的,可以将其全部存储在您的文件系统中。

当事情开始变慢时,您可以租用 CDN。

这将如何运作?

CDN 位于您的图像服务器前面,每当向 CDN 请求文件时,如果它在其存储中找不到它(缓存未命中),它将从您的图像服务器复制它。稍后,当 CDN get 再次被请求时,它将从它自己的缓存中传送图像。

这种方式不需要任何代码来迁移到 CDN 图像交付,您需要做的就是更改站点中的 url 并雇用 CDN,这同样适用于 S3 存储桶。

这不是一项便宜的服务,但它比 cloudfront 便宜得多,当您需要它时,您可能负担得起。

根据经验,不要在数据库中保存文件。

mysql 手册对此有何说明? http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-optimization-tips.html

With Web servers, store images and other binary assets as files, with the path name stored in the database rather than the file itself. Most Web servers are better at caching files than database contents, so using files is generally faster. (Although you must handle backups and storage issues yourself in this case.)

根本不要将 base4 编码的文件保存在数据库中

Works fine, but take so much time that i expected. Hence, image are 33% bigger size, and totally looks bulgy.

如您所见,encoding/decoing 中的不必要开销 + 额外的 space 用完了,这意味着来回传输的数据也会增加。

正如@mike-m 所提到的。 Base64 编码不是一种压缩方法。为什么使用 Base64 编码也由 @mike-m 发布的 link 回答 What is base 64 encoding used for?.

简而言之,在将图像存储到文件系统(无论是 S3 还是其他文件系统)之前,使用 base64 编码图像没有任何好处,但也有很多损失。

不涉及 base64 的 Gzip 或其他压缩形式呢?答案再次是,没有任何收获,反而会失去很多。例如,我只是压缩了一张 1941980 JPEG 图像并保存了 4000 字节,节省了 0.2%。

原因是图片已经是压缩格式了。它们无法进一步压缩。

当您在不压缩的情况下存储图像时,它们可以直接传送到浏览器和其他客户端,并且可以缓存它们。如果它们被压缩(或 base64 编码),它们需要由您的应用程序解压缩。

现代浏览器能够显示嵌入到 HTML 中的 base64 图像,但是它们无法被缓存并且数据比需要的数据大大约 30%。

这是一个例外吗?

User can post there data and image and all are secure.

我猜你的意思是用户可以下载属于他或与他共享的图像。这可以很容易地通过将文件从 webspace 保存在文件系统中并仅保存数据库中的路径来实现。然后使用 fpassthru

将文件发送到客户端(在进行必要的检查后)

当我增长到 100000 个用户时怎么办

How they take care about images file. In performance issue, when large user involved, it seams to me, i need 100000 folder for 100000 user and their sub folder. When large amount of user browse same root folder, how file system process each unique folder.

使用 CDN 或使用 BTRFS 等特别适用的文件系统

Database has good searching facility, good thread safe connection, good session management. Is this scenario changed when large operation involved

是的。通过在数据库中保存有关文件及其文件路径的所有信息来充分利用它。然后将文件本身保存在文件系统中。两全其美。

我建议您继续只使用 base64 字符串,您可以使用 LZ 字符串压缩技术来减小字符串大小。我一直在用,效果很好。

我不知道我离你的问题有多近,但希望这能帮助你。 这是 LZ 压缩技术:https://github.com/pieroxy/lz-string/