基础64图像从数据库中select和编码时发现缓慢

我在ionic framework下工作。 目前正在devise一个文字和图像的文章页面。 用户可以发布那里的数据和图像,都是安全的。

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

encodeURIComponent($scope.image) 

每当用户请求,我从表中select行,并显示它们与文本和解码。

 decodeURIComponent($scope.image) 

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

工作正常,但花了很多时间,我期望。 因此,图像尺寸增加了33%,并且看起来很苍白。

然后,我决定移动cordova的file upload插件。 但是我意识到,以这种方式维护文件是非常危险和复杂的。 我也尝试将二进制数据保存到数据库中。 但失败了。

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

由于这只是个人文件,你可以将它们存储在S3中。

为了安全地上传文件,只需在上传之前检查文件的MIMEtypes,以select任何存储空间。

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

只需运行一个快速检查上传的文件:

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

没什么大不了!

保持数据库上的文件是不好的做法,它应该是你的最后一个资源。 S3对于许多用例来说是很好的,但是对于高用途而言,它是昂贵的,本地文件只能用于内联网和非公开的应用程序。

在我看来,去S3。

亚马逊的SDK很容易使用,你可以得到一个1GB的免费存储空间来进行testing。 你也可以使用你自己的服务器,只是把它放在你的数据库之外。

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

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

解决scheme:使文件夹名称为'abs(userID / 1000)* 1000'/ userID

这样,当你有用户ID 989787它的图像将存储在文件夹989000/989787 / img1.jpeg 989000/989787 / img2.jpeg 989000/989787 / img3.jpeg

在那里你已经有了一种为一百万用户存储图像的方式,它不会破坏Unix文件系统。

如何存储大小?

上个月,我不得不为我工作的电子商务压缩130万个JPEG。 上传图片时,使用imagick压缩,无损标志和80%的质量。 这将删除不可见的像素和优化您的存储。 由于我们的图像从40×40(缩略图)到1500×1500(缩放图像)不等,我们平均有700×700的图像,130万的图像,其中约120GB的存储空间。

所以是的,可以将它们全部存储在文件系统中。

当事情开始变慢时,你会雇用一个CDN。

这将如何工作?

CDN位于图像服务器的前面,每当文件请求CDN时,如果CDN没有在存储器中find(caching未命中),它将从图像服务器复制CDN。 稍后,当CDN再次被请求时,它将从它自己的caching中传递图像。

通过这种方式,不需要代码就可以迁移到CDN映像,您只需更改站点中的URL并雇用CDN,这与S3存储桶的工作方式相同。

这不是一个便宜的服务,但它比云端便宜,当你需要它的时候,你可以负担得起。

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

mysql手册有什么要说的呢? http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-optimization-tips.html

使用Web服务器,将图像和其他二进制资产存储为文件,path名称存储在数据库中,而不是文件本身。 大多数Web服务器比数据库内容更好地caching文件,所以使用文件通常更快。 (尽pipe在这种情况下您必须自己处理备份和存储问题。)

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

工作正常,但花了很多时间,我期望。 因此,图像尺寸增加了33%,并且看起来很苍白。

正如你发现的那样,在编码/修饰+额外空间耗尽的额外开销也意味着额外的数据传输。

投票正如@迈克米已经提到。 Base64编码不是一种压缩方法。 为什么使用Base64编码还通过@ mike-m发布的链接回答什么是base 64编码用于?

简而言之,在将它们存储在文件系统上之前,没有什么可以通过base64编码图像来获得和释放,不pipe是S3还是其他。

如果不涉及base64,Gzip或其他forms的压缩呢? 答案还是没有什么可以获得,也没有什么可以输的。 例如,我只是gzipped一个1941980的JPEG图像,并保存了4000个字节,节省了0.2%。

原因是图像已经是压缩格式。 他们不能被进一步压缩。

当你存储图像没有压缩,他们可以直接传递给浏览器和其他客户端,他们可以被caching。 如果他们被压缩(或base64编码),他们需要由您的应用程序解压缩。

现代浏览器能够显示embedded到HTML中的base64图像,但不能被caching,数据大约比需要的大30%。

这是规范的例外吗?

用户可以发布那里的数据和图像,都是安全的。

我认为你的意思是说用户可以下载属于他的图像或与他共享的图像。 这可以通过将文件从文件系统中的空间节省并仅保存数据库中的path来轻松实现。 然后用fpassthru将文件发送到客户端(在完成所需的检查之后)

那么当我成长为10万用户呢?

他们如何照顾图像文件。 在性能问题,当涉及大用户,它接缝我,我需要100,000个用户和他们的子文件夹100000文件夹。 当大量的用户浏览同一个根文件夹时,文件系统如何处理每个唯一的文件夹。

使用CDN或使用特别适合于此的文件系统,如BTRFS

数据库有良好的searchfunction,线程安全连接好,会话pipe理良好。 当涉及大量操作时,这种情况是否改变?

确实是的。 通过保存所有关于文件的信息以及它在数据库中的文件path来充分利用它。 然后将文件保存在文件系统中。 你两全其美。

我build议你只继续使用base64string,你可以使用LZstring压缩技术来减lessstring的大小。 我一直在使用,它工作得很好。

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