V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rv54ntjwfm3ug8
V2EX  ›  程序员

base64 编码图片一般会使体积变大多少?

  •  
  •   rv54ntjwfm3ug8 · 2022-04-15 21:05:25 +08:00 · 6687 次点击
    这是一个创建于 951 天前的主题,其中的信息可能已经有所发展或是发生改变。

    客户要求把用户上传的 8~9MB 照片全部 base64 保存进数据库防止被传马,API 直接返回 base64 ,给他解释 base64 会让图片变大他理解不了

    40 条回复    2022-04-18 09:33:16 +08:00
    rainboat
        1
    rainboat  
       2022-04-15 21:10:15 +08:00
    实践是检验真理的唯一标准,多找几张图转成 base64 编码试试
    claneo
        2
    claneo  
       2022-04-15 21:11:54 +08:00
    33%
    gdfsjunjun
        3
    gdfsjunjun  
       2022-04-15 21:13:27 +08:00
    数据库存 base64?是个勇士
    gdfsjunjun
        4
    gdfsjunjun  
       2022-04-15 21:14:17 +08:00
    自己搭建图床系统,数据库只存图片路径
    yaoyao1128
        5
    yaoyao1128  
       2022-04-15 21:14:25 +08:00 via iPhone   ❤️ 1
    36
    This encoding causes an overhead of 33–36% (33% by the encoding itself; up to 3% more by the inserted line breaks).
    来源 维基百科 Base64
    但是 gzip 可以解决一部分
    chendy
        6
    chendy  
       2022-04-15 21:17:46 +08:00
    数据库存 blob 呗,base64 何必呢
    jinliming2
        7
    jinliming2  
       2022-04-15 21:26:14 +08:00   ❤️ 1
    @yaoyao1128 通常不做展示的话,不会插换行符的,所以就是 33%
    aptx4689
        8
    aptx4689  
       2022-04-15 21:47:54 +08:00   ❤️ 2
    你可以给他演示一下用 base64 存数据库也能挂马
    crab
        9
    crab  
       2022-04-15 21:57:03 +08:00
    4/3
    yuzo555
        10
    yuzo555  
       2022-04-15 22:04:09 +08:00   ❤️ 2
    三个字节的原文会变成 4 个字节的 Base64 编码。
    Tink
        11
    Tink  
       2022-04-15 22:19:40 +08:00 via Android
    数据库字段得多长.
    FreeEx
        12
    FreeEx  
       2022-04-15 22:21:52 +08:00 via iPhone
    minIO 不好用吗
    xianrenT
        13
    xianrenT  
       2022-04-15 22:25:52 +08:00
    @gdfsjunjun 为啥是个勇士,除了占用空间还有什么坏处吗?
    luzemin
        14
    luzemin  
       2022-04-15 22:33:37 +08:00
    @xianrenT 传输带宽
    vvhhaaattt
        15
    vvhhaaattt  
       2022-04-15 23:06:47 +08:00 via Android
    我记得谷歌相册 web 就是将图片 base64 编码后上传?
    vvhhaaattt
        16
    vvhhaaattt  
       2022-04-15 23:14:35 +08:00 via Android
    @vvhhaaattt 搜索了下没有相关文档。但我记得是哪个服务上传图片的接口要用 base64 编码,文档中还提到图片大小跟占用宽带不一致,服务端限制的图片大小而不是宽带大小。
    另外 base64 编码后比较方便放到 json 中,统一接口 content type 。
    vvhhaaattt
        17
    vvhhaaattt  
       2022-04-15 23:16:40 +08:00 via Android
    😅没仔细看是入库编码啊……
    xtinput
        18
    xtinput  
       2022-04-15 23:22:49 +08:00
    base64 的有效数据 75%,所以会增大 33.333%
    kaiki
        19
    kaiki  
       2022-04-15 23:25:53 +08:00
    前端获取不到后端文件的路径的话,就算是木马也没法执行啊,原文件储存,中间用个图片解析程序中转下不就行了
    mikewang
        20
    mikewang  
       2022-04-16 00:16:05 +08:00   ❤️ 9
    Base64 ,故名思义,64 进制( 2^6 ),一个字符表示 6 个比特数据
    一个字符计算机储存为 8 个比特,多出来(8-6)/6 = 1/3 = 33.33%
    3dwelcome
        21
    3dwelcome  
       2022-04-16 00:52:41 +08:00   ❤️ 1
    说出来你们可能不信,base64 增大的那 33%,只要用目前较强力的压缩算法,比如 7z ,又可以把增大的部分给压回去。

    所以 base64+7z, 可能最终对比原图 JPG 大小,也就大个 5%。
    IvanLi127
        22
    IvanLi127  
       2022-04-16 01:12:40 +08:00 via Android
    还不趁机加价加工期
    sneezry
        23
    sneezry  
       2022-04-16 03:08:07 +08:00
    这都是什么可爱客户
    Quarter
        24
    Quarter  
       2022-04-16 08:21:41 +08:00 via iPhone
    mongo ?
    play78
        25
    play78  
       2022-04-16 08:40:44 +08:00
    这种方式有个客户刚好用上,最后问,为什么每次请求都那么慢。
    是因为普通的文件服务器,图片能在浏览器缓存,而数据库查询出来的图片,做缓存很麻烦,要写代码做。
    gam2046
        26
    gam2046  
       2022-04-16 09:47:30 +08:00   ❤️ 1
    @3dwelcome #21 7z 以后还是 blob 数据,那么既然如此,为何还要走 base64 -> 7z 这条路,直接图片本身 blob 入库。最后结果是一样,而且这么兜了一圈以后,base64 浪费一遍 CPU 资源,zip/unzip 又费一次 CPU 。
    cheng6563
        27
    cheng6563  
       2022-04-16 12:40:21 +08:00
    存储体积会涨 36%,但是,内存占用可能会翻个好几倍
    Askiz
        28
    Askiz  
       2022-04-16 12:57:35 +08:00
    @aptx4689 这能做到吗?
    markgor
        29
    markgor  
       2022-04-16 13:13:25 +08:00
    之前有遇到过一个搞.NET PC 端的,他们就是把图片传入 sqlserver 的,但没有 base64 ,直接传 blob 。
    我觉得直接把图片传入数据库中好处是:不用理会路径。
    坏处是:当 sqlserver 为远程时容易把 sqlserver 的带宽打满导致响应不了其他请求。


    其实配置下静态目录和执行权限,安全系数不会比存数据库低吧,而且就算存数据库为什么要 base64 呢?
    markgor
        30
    markgor  
       2022-04-16 13:16:38 +08:00
    话说这让我联想起 9 年前,和客户吃饭时客户专门带上懂电脑的朋友,试探性的问了我一句如果被 DDOS 了怎么办。
    我那时候回复是只能硬抗,要么上设备清洗要么加大带宽。
    然后他似笑非笑的说为什么不把 DNS 改为 127.0.0.1
    当时我很无语,随后问他那拔网线不是更快......
    Cusmate
        31
    Cusmate  
       2022-04-16 13:48:23 +08:00
    @markgor 这位改 dns 解析思路异于常人,卖服务的怎么就没想到这个点子呢。
    aylmer
        32
    aylmer  
       2022-04-16 14:48:30 +08:00
    直接上 oss 就解决的事,为什么要弄得这么麻烦呢
    en20
        33
    en20  
       2022-04-16 15:02:45 +08:00
    经典客户不懂装懂,你还是顺着他意思吧
    wupher
        34
    wupher  
       2022-04-16 17:28:25 +08:00   ❤️ 1
    他愿意为此掏钱就照做吧,不过建议明确注明此项技术方案是甲方要求,由此引发的相关问题不担责即可。
    marcojbk
        35
    marcojbk  
       2022-04-16 22:02:41 +08:00 via iPhone
    这不是好事吗,硬件要求又提高不少,买硬件的回扣你能多挣不少呢
    caisanli
        36
    caisanli  
       2022-04-17 08:41:46 +08:00 via iPhone
    我以前搞过一次 做一个新闻页 需要上传图片 领导不给文件服务资源 我就把图片转 base64 存数据库🤣
    mutalisk
        37
    mutalisk  
       2022-04-17 11:29:34 +08:00
    @3dwelcome 压回去不又变成二进制流了么,很多都是不可见字符。本来做 base64 的目的不就是都是可见的字符么,便于 json 传输或者终端打印。既然要压,那干嘛不直接用原来的图片字节流呢。
    PopRain
        38
    PopRain  
       2022-04-17 15:16:29 +08:00
    @Cusmate 他可能认为攻击是基于域名而不是 IP 地址,改一下让他们自己攻击自己
    shanyue
        39
    shanyue  
       2022-04-17 20:17:08 +08:00   ❤️ 1
    33%,可以根据这个工具 https://devtool.tech/base64 ,看一下编码的过程,为什么是 33% 一目了然。
    debuggeeker
        40
    debuggeeker  
       2022-04-18 09:33:16 +08:00
    其实如果不是需要原图的话,可以保存 2 份,保存一次原图,制作一次采样图片,也保存到 oss 中,这种图片肯定不放数据库的,都是第三方储存桶。客户需要图片,就把图片地址丢给他,原图和采样都给,然他自己拿。采样工具可以 GitHub 看 Luban
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1005 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 22:22 · PVG 06:22 · LAX 14:22 · JFK 17:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.