后台给前端传图片,Base64

2023-11-09

本文章是经查阅网上的一些文章,自己进行总结,做笔记方便以后查阅。

本篇文章背景:

因为想要实现给图片加文字,并在前端预览的功能,这涉及到Base64,特此记录。

后端给前端传图片:

一般后台给前端传图片,有两种方式:一种是通过response.getOutputStream直接将图片以的形式写到页面显示,另一种是先把图片上传到服务器,拿到url地址后把url地址给前端。
此外,也可以将图片的字节数组通过Base64编译后返回给前端,前端直接拿了可以显示为图片。

一、字节数组Base64编译

byte[] bytes;	// 图片的字节数组
BASE64Encoder encoder = new BASE64Encoder();
String data = encoder.encode(bytes);	// //data = iVBORw0KGgoAAAANSUhEUgAAAFAAAAAaCAIAAACvsEzwAAABxElEQVR42tWYS2rDMB......

二、前端显示

前端拿到这个data字符串后,有两种方式显示图片:
先拼接一下前缀,分别是data:图片类型; 编码类型, data字符串数据

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAaCAIAAACvsEzwAAABxElEQVR42tWYS2rDMB......

第一种方式,css:

div.image {
    width: 99px;
    height: 42px;
    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA......);
}

第二种方式,img标签

<img width="900" height="450" src="https://img-blog.csdnimg.cn/2022010612264818856.png"/>

注意,如果图片很大的话,转成的data字符串也很长,原作者一个小图片就15w字符,所以这种方式适合比如logo,验证码这种小图片,又不希望存在服务器的应用场景!!!
在这里插入图片描述

Base64:

参考文章如下:
一篇文章彻底弄懂Base64编码原理

一、Base64的由来

在参数传输过程中:中文出现乱码、传输的字符不是可打印的字符,比如二进制文件、图片等。因此,Base64出现,其基于64个可打印的字符来表示二进制的数据,以解决上述问题。Base64在URL、Cookie、网页传输少量二进制文件中也有相应的应用。

二、Base64的原理

每当我们使用时Base64时,都会先定义一个类似的数组:

['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/']

这是Base64的索引表,字符选用了“A-Z、a-z、0-9、+、/”64个可打印字符,这是标准的Base64协议规定。日常使用中还会看到“=”或“==”出现在Base64的编码结果中,“=”在此是作为填充字符出现,会面会讲到,适用于位数不足的情况。

三、具体转换步骤

1.将待转换的字符串每三个字节分为一组,每个字节占8bit,那么共有24个二进制位;
2.将上面的24个二进制位每6个一组,共分为4组;
3.在每组前面添加两个0,每组由6个变为8个二进制位,总共32个二进制位,即4个字节;
4.根据Base64编码对照表(见下图)获得对应的值;

0 A   17 R   34 i   51 z
1 B   18 S   35 j   52 0
2 C   19 T   36 k   53 1
3 D   20 U   37 l   54 2
4 E   21 V   38 m   55 3
5 F   22 W   39 n   56 4
6 G   23 X   40 o   57 5
7 H   24 Y   41 p   58 6
8 I   25 Z   42 q   59 7
9 J   26 a   43 r   60 8
10 K  27 b   44 s   61 9
11 L  28 c   45 t   62 +
12 M  29 d   46 u   63 /
13 N  30 e   47 v
14 O  31 f   48 w   
15 P  32 g   49 x
16 Q  33 h   50 y

从上面的步骤我们发现:

  • Base64字符表中的字符原本用6个bit就可以表示,现在前面添加2个0,变为8个bit,会造成一定的浪费。因此,Base64编码之后的文本,要比原文大约三分之一。
  • 为什么使用3个字节一组呢?因为6和8的最小公倍数为24,三个字节正好24个二进制位,每6个bit位一组,恰好能够分为4组。

四、示例说明

以下面的表格为示例,具体分析:
在这里插入图片描述
对应步骤如下:

  • 1.“M”、“a”、"n"对应的ASCII码值分别为77,97,110,对应的二进制值是01001101、01100001、01101110。如图第二三行所示,由此组成一个24位的二进制字符串。
  • 2.如图红色框,将24位每6位二进制位一组分成四组。
  • 3.在上面每一组前面补两个0,扩展成32个二进制位,此时变为四个字节:00010011、00010110、00000101、00101110。分别对应的值(Base64编码索引)为:19、22、5、46。
  • 4.用上面的值在Base64编码表中进行查找,分别对应:T、W、F、u。因此“Man”Base64编码之后就变为:TWFu。

五、位数不足情况

上面是按照三个字节来举例说明的,如果字节数不足三个,那么该如何处理?
在这里插入图片描述

  • 1个字节:共8个二进制位,按规则分组,每6个一组,则第二组缺少4位,用0补齐,得到两个Base64编码,而后面两组没有对应数据,都用“=”补上。因此,上图中“A”转换之后为“QQ==”;
  • 2个字节:共16个二进制位,按规则分组,每6个一组,则第三组缺少2位,用0补齐,得到三个Base64编码,第四组完全没有数据,则用“=”补上。因此,上图中“BC”转换之后为“QKM=”;

六、注意事项

  • 大多数编码都是由字符串转化成二进制,而Base64的编码则是从二进制转换成字符串
  • Base64编码主要用在传输、存储、表示二进制领域,不能算得上加密,只是无法直接看到明文,也可以通过打乱Base64编码来进行加密
  • 中文有多种编码(比如UTF-8、GB2312,GBK),不同编码对应Base64编码结果不一样

七、延伸

上面我们已经看到了Base64就是用6位(2的6次幂就是64)表示字符,因此称为Base64。
同理,Base32就是用5位,Base16就是用4位。

八、验证

最后,用Java代码来验证一下上面的转换结果

package com.secbro2.blog.utils;
import sun.misc.BASE64Encoder;
public class Base64Utils {
	public static void main(String[] args) {
		String man = "Man";
		String a = "A";
		String bc = "BC";
		BASE64Encoder encoder = new BASE64Encoder();
		System.out.println("Man base64结果为:" + encoder.encode(man.getBytes()));	// TWFu
		System.out.println("BC base64结果为:" + encoder.encode(bc.getBytes()));	// QkM=
		System.out.println("A base64结果为:" + encoder.encode(a.getBytes()));	// QQ==
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

后台给前端传图片,Base64 的相关文章

  • 如何访问 javascript 文件中的查询字符串

    可能的重复 如何获取查询字符串值 https stackoverflow com questions 901115 how can i get query string values 可以说 我们有一个
  • 单击表格行可显示更多信息

    我正在尝试使用 jQuery 来实现以下目标 当单击一个表格行时 会显示表格行内的 info div 如果单击另一个表格行 则当前显示的任何其他 info 元素将被隐藏 并根据表格行显示新的 info div已被点击 这个问题是 代码无法正
  • CSS3 变换:IE 中的缩放

    我想使用CSS3属性transform scale div transform scale 0 5 0 5 有没有办法在 Internet Explorer 8 及更低版本中模仿这个 可能与filter或者 JavaScript 解决方案
  • 如何在 Shiny 中动态渲染的 textInput 添加样式元素

    你好堆栈溢出 在我最近提出的问题中 我已经解决了一些与动态渲染 UI 元素相关的主要问题 并在一些了不起的人的帮助下动态创建了观察者 参见此处 动态渲染的 UI 如何在第二次运行时删除旧的反应变量 https stackoverflow c
  • 如何在 CSS 中将 RadioButton 图标样式设置为无(在 Flex 3 中)?

    您可以通过在 CSS 中设置以下值来在 Flex 中设置 RadioButton 的外观 upSkin Embed overSkin Embed ownSkin Embed disabledSkin Embed selectedUpSkin
  • 如何使用 CSS 或 jQuery 设置第一个和最后一个 li 的样式?

    我如何设计第一个 顶级 li和最后一个 顶层 li使用 CSS 还是 jQuery 我正在使用 CSS 设置第一个li但它也是造型第一li在每个中学阶段ul 那么我怎样才能让它只设置样式li其中包含 Main 1 最后一个包含 Main 6
  • 从选择 onChange 调用 javascript 函数 [重复]

    这个问题在这里已经有答案了 所以我有一个简单的 HTML 选择框和一个 javascript 警报功能 我希望选择框有一个 onchange 事件来调用 javascript 警报函数 这是我到目前为止所拥有的 HTML div Type
  • 使用 jQuery inputmask 插件范围 0-100

    如何创建 0 到 100 范围内的掩码 document ready function masked inputmask 您可以使用jquery inputmask regex extensions js为了那个原因 你可以找到带有所有扩展
  • 如何使用CSS缩放图像以填充div并保持纵横比?

    我想用一个 div 填充img 保持纵横比并根据需要拉伸宽度或高度以适应 div style width 80px height 80px img src div 我怎样才能实现它 如果图像不是二次方的 则必须将其 放大 并根据哪一侧较大而
  • CSS 边框样式 INSET 或 GROOVE 看起来与 IE9 FF4 或 Safari5 或 Chrome2 非常不同

    抱歉 我是个白痴 但是当我尝试获得某种凹槽效果或插入效果作为边框样式时 我从不同的浏览器中得到了一些非常非常大的视觉结果 使用时 border 5px groove A00 or border 5px inset A00 Firefox 3
  • 如何显示接下来的三个图像单击加载更多按钮

    我需要一个加载更多按钮来显示图像 页面加载时 我显示 3 个图像 单击 加载更多 按钮后 接下来的 3 个图像将显示在屏幕上 我尝试了下面的代码 但它不起作用 你能帮我解决这个问题吗 function item slice 0 2 show
  • 使用 float:left 与 display:inline-block 的 jQuery UI 拖放排序比较

    我这里有两个例子 这两个例子之间的唯一区别是 一种使用display inline block 另一种使用float left li doc item 显示 内联块 与 li doc item float left 我的问题是 displa
  • 全高全宽 CSS 布局

    我正在寻找一种方法来创建具有 5 个区域的纯 CSS 无 JavaScript 布局 如下所示 H A B C F
  • AngularJS + jQuery 移动

    是否还有其他可能性来设计AngularJS以移动友好的方式应用程序CSS 我正在计划一个移动应用程序 并希望使用 AngularJS 进行逻辑和数据绑定 但我不想自己设计所有内容CSS The AngularJSFAQ说它使用jQuery
  • 如何在html中定义条件换行符?

    我希望这根绳子断在 如果需要的话 没有地方可以写了 7 380 Ft 159 Ft term kd jjal like 7 380 000 Ft 159 125 Ft term kd jjal 如何在html中实现这一点 nbsp 产生 错
  • Svelte 条件元素类报告为语法错误

    我正在做一个if块每if 块的精简指南 https svelte technology guide if blocks 这看起来很简单 但 Svelte 认为这是一个语法错误 svelte plugin ParseError Unexpec
  • WordPress 子主题包括包含文件

    我在一家WordPress使用 AMPPS 作为本地主机在我的本地计算机上进行设置 使用 Delta 主题 我创建了一个子主题 delta2 child 初始设置效果很好 但是 我需要更改包含文件夹中名为 home slider php 的
  • 使用flex-basis控制行上显示的项目数

    我想在使用 Flex 时将元素推出以隐藏它们 例如 如果flex basis为 50 仅显示两个项目弯曲到给定空间 而其他元素则在overflow hidden 领土 Or if flex basis为 25 则仅显示 4 个 Flex 元
  • 我应该创建一个块还是一个元素 BEM CSS?

    Bem官网说 创建一个块如果一段代码可以被重用并且它不依赖于正在实现的其他页面组件 创建一个元素如果一段代码在没有父实体 块 的情况下无法单独使用 我有一个 关于部分 块 它的元素依赖于父级并且不能在网站中重复使用 如何根据 bem 这段代
  • 为什么我的 Web 组件 CSS 不显示?我没有使用shadowDOM

    我有一个没有使用 ShadowDOM 的 Native V1 组件 所以我将 CSS 放在 但是当其他人使用我的组件时 我的 CSS 就不再起作用了 仅当其组件确实使用 ShadowDOM 时才会发生这种情况 我的组件的示例代码 class

随机推荐

  • 第2章 数据类型,运算符和表达式总结

    一 先举一个简单的例子 首先第1行是我们必不可少的头文件 其次从左至右那个int为返回参数 中间是方法名 可自定义 然后括号里面的是输入参数 那个中括号或者的是一个整体 下一行就是输出函数 括号内是输出内容 需要用双引号标注 然后就用分号结
  • Ajax实现异步请求的整个过程

    var xhr xhr new XMLHttpRequest 创建一个异步对象 xhr open Get test ashx true Get方式括号中的三个参数分别为 1 发送请求的方式 2 样请求的页面 3 是否异步 xhr open
  • 机器学习(一)——K-近邻(KNN)算法

    机器学习 一 K 近邻 KNN 算法 最近在看 机器学习实战 这本书 因为自己本身很想深入的了解机器学习算法 加之想学python 就在朋友的推荐之下选择了这本书进行学习 一 K 近邻算法 KNN 概述 最简单最初级的分类器是将全部的训练数
  • 【Blender】基础物体建模(5)

    Blender 布尔运算不起作用怎么办 当两个物体执行了布尔之后 不起作用 2 先检查每个物体的面是否是封闭的 可以看到是全部封闭的 3 注意 当我们执行了布尔时 有一个物体会变成线框 此时只需将物体属性中的视图显示修改为实体即可 4 开始
  • 2015C蓝桥杯第五题九数组分数

    题目 1 2 3 9 这九个数字组成一个分数 其值恰好为1 3 如何组法 下面的程序实现了该功能 请填写划线部分缺失的代码 include
  • Frontiers in Neuroscience:弥散张量成像(DTI)研究指南

    弥散张量成像 DTI 的研究越来越受到临床医生和研究人员的欢迎 因为它们提供了对脑网络连接的独特见解 然而 为了优化DTI的使用 必须考虑到几个技术和方法方面的问题 因为这些问题会影响到DTI研究结果的准确性和可重复性 本文由葡萄牙学者发表
  • 浅谈list与vector的区别

    目录 前言 一 list和vector为何有区别 二 链表和顺序表 数组 的优缺点 即list和vector优缺点 前言 在学习完list和vector这两个运用最广泛的容器后我们发现这两个容器有许多相似的用法 甚至在大多时候 有时候不行
  • 收集整理近700套微信朋友圈h5小游戏源码合集大放送

    收集整理近700套微信朋友圈小游戏源码合集 HTML5最新微信手机WAP端小游戏源码 内容全部无加密 可以修改成自己的内容 上传空间即可使用 附件下载 http www 51xyyx com 2762 html 空间要求 php mysql
  • 如何将JavaWeb项目部署到Linux服务器

    将JavaWeb项目部署到服务器需要先在服务器安装tomcat 数据库 Java环境 没有安装的同学先装好以上三件套 当装好这三样后就可以开始部署JavaWeb项目了 其实很简单 将项目打包成war文件后上传到tomcat下的webapps
  • 芯片学生党必会的行业英文术语

    转载至芯职业公众号 芯片领域有不少英文缩写术语 对学生党与初学者颇为费解 严重的还会给人 劝退 感 因此 在这个系列 我们将介绍一些常用的英文术语 旨在让大家了解这些英文的同时对芯片产业的全貌有一个大体的认识 并不作过分深究 Wafer D
  • Android 用surfaceview模拟帧动画的效果,解决帧动画的OOM问题

    最近做的项目 客户临时要求改版 我真的是最烦这个 要求跟换主页面的背景 换上新的背景图 要求是动态的 效果 我随便拿的五个图片做的gif 方案 帧动画方案 缺点 1 好像只能imageview才能播放帧动画 2 容易OOM 播三四张还行 播
  • 9款超级实用 VSCode 插件,让 Python 编程轻松愉悦

    1 Python preview Python Preview是一个适用于VSCode的Python代码预览插件 可以将Python代码转换为漂亮的HTML页面 并在浏览器中进行预览 通过该插件 程序员可以在VSCode中方便地预览Pyth
  • 点云Las文件读写c++库 Lasib_msvc2015

    点云Las文件读写c 库 Lasib msvc2015 前言 去官网下载laslib源码 发现编译错误 需要以下的几个依赖库 1 在进行编译之前我们首先需要编译Boost GDAL TIFF LASZIP和GeoTIFF的编译 大家可以参考
  • Win11安装WSL2和Nvidia驱动(2022-12-19)

    文章目录 前言 系统环境 WSL 1和WSL 2功能对比 安装WSL2 更新和升级包 配置VSCode 配置GPU加速 安装Nvidia驱动 安装Cuda Toolkit 通过PyTorch安装CUDA Toolkit 测试Nvcc 参考链
  • 使用pancake进行 usdt兑换bnb智能合约

    以下是代码 仅供分享参考 SPDX License Identifier MIT pragma solidity 0 8 0 interface IERC20 function approve address spender uint256
  • 31、element 解决el-select 下拉选择默认赋值后,无法再次选择数据的问题

    问题 初始化数据 下拉框默认选中第一个数据后 无法再次选择其他数据 getPowerSelectBus netid getSelectBusNew netid netid then res gt this optionProps res d
  • 解决Fiddler监听APP,无法抓取HTTPS数据,APP无法联网的问题

    使用Fiddler监听APP APP却无法联网 这里的环境是手机模拟器 这里采用雷电模拟器 JustTrustMe apk 链接 https pan baidu com s 1DNSECMGdCubRQprVYXkWdw 提取码 4j3y
  • Android 11适配

    Android 11 R 适配 1 存储机制更新 Scoped Storage 分区存储 应用 targetSdkVersion gt 30 强制执行分区存储机制 之前在AndroidManifest xml中添加 android requ
  • 2021-12-21 网工基础(十三) STP的选举规则、STP的接口状态、边缘端口、生成树版本的进化、链路聚合技术原理与配置

    一 STP的选举规则 1 在交换网络中选举一个根桥 Root Bridge 比较Bridge ID桥ID 优先级 MAC地址 越小越优 为了确保交换网络的稳定 建议提前规划STP组网 并将规划为根桥的交换机的桥优先级设置为最小值0 2 在每
  • 后台给前端传图片,Base64

    本文章是经查阅网上的一些文章 自己进行总结 做笔记方便以后查阅 本篇文章背景 因为想要实现给图片加文字 并在前端预览的功能 这涉及到Base64 特此记录 后端给前端传图片 一般后台给前端传图片 有两种方式 一种是通过response ge