记一个JS获取base64编码地址图片传到后台时无法识别的坑

oy4年前 (2022-06-22)技术研究3403

事情是这样的,前端一个DIV用了属性加上图片背景,比如

<div class="posterbox" style="background-image: url("data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gIoSUNDX1BST0ZJTEUAAQEAAAIYAAAAAAQwAABtbnRyUkdCIFhZWiAAAAAAAAAAAAAAAABhY3NwAAAAAAAhIQg//2Q=="); background-position: center center; background-size: cover;"></div>

中间一长串的base64编码我就省略不写了


下面用JS来获取这串base64数值

// 获取元素的属性值
var img_base64 = $('.posterbox').css('background-image');
// console.log(img_base64);  显示:url("data:image/jpeg;base64,/9j/4AXXXXXX==")

// split分割取出上面属性中url()中间的base64
img_base64 = img_base64.split('(')[1].split(')')[0];


到此时img_base64变量就是这个base64的字符串,POST到后台,发现不是有效的base64字符串无法转储为图片。查看提交的数据,确实是包含此base64字符串的,同时打印出后端所接收到的字符串和前端一致,是合法完整的base64编码:

微信截图_20220622044716.png

查了很多百度的资料,说是base64编码在post过程中部分符号会被转义,前端要先urlencode,后端再decode。试过无效。


最后发现,原因竟然是在前端提交控制台所显示的base64字符串前后双引号"",不是代表这是字符串类型,而是真的有这个符号提交到后端。而后端var_dump()打印字符串的时候刚好也带有这个符号,看上去是相同的,这就是最坑的地方……


把双引号去掉,修改上述取url()中间base64部分的代码为:

img_base64 = img_base64.split('("')[1].split('")')[0];


最后再次提交,base64字符串没有双引号了,问题解决!

微信截图_20220622045302.png


之前在取img标签src为base64字符串的图片地址时无此问题,因为直接获取元素src的地址就可以了,没有双引号问题,这个url()地址是有双引号的,浪费我2个小时时间,我是真的是会谢。

相关文章

Win7自带驱动并不完美

Win7自带驱动并不完美

Win7在驱动方面提供了在线匹配下载,给我们极大的方便,例如新安装了一个常用的硬件,如摄像头、打印机等,Win7基本上可以自动识别并从Windows Update网站上下载对应驱动,但是有些驱动还是在…

Google应该这样用!

美国人教你这样用Google,你真的会变特工!!!(看了才感叹原来这么多年的GOOGLE是白用了~这就是百度永远无法超越G的原因吧~转) 第一篇在搜索框上输入:“indexof/…

QQ最新版本号(更新至QQ2011 Beta1)

[Versions]2101=<QQ2011 Beta1>2107=<QQ2011 Beta1 优先体验版>1C53=<腾讯QQ概念版>1F57=<QQ201…

VB输出Excel表格

Private Sub cmdSwatch_Click()Dim xls As excel.ApplicationDim xlbook As excel.Workbook'On Error GoTo…

揭开无线网络经常掉线之谜

揭开无线网络经常掉线之谜

使用无线网络的朋友们,哪类无线故障问题最让你心烦呢?掉线、断网、还是掉线、断网。没错,相信这个故障刺痛过每个无线用户的心......。那么当掉线、断网又一次出现在你面前的时候,你有好的解决办法来应对吗…

无线网络可以同时Ping通多个IP段

无线网络可以同时Ping通多个IP段

如图,笔者发现一个非常奇怪的现象: 将路由IP地址设置为 192.168.150.1 ,子网掩码 255.255.255.0 ,在这个C类域的限制下,只有主机192.168.150.x 的主…

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。