首页 > 编程语言 >java base64字符串转换为图片

java base64字符串转换为图片

时间:2023-11-07 09:14:31浏览次数:44  
标签:java image base64 avatar 字符串 png 图片

java base64字符串转换为图片

实现步骤:

base64字符串长这样'"data:image/png;base64,iVBORw0KGgoAAAAN(中间省略好多字符串)AAAABJRU5ErkJggg=='

方法一:

首先,图片本质上是一种二进制文件,所以创建一张图片,就是创建一个文件,里面写入二进制的数据。

  1. # 参数avatar接收base64字符串
  2. # 1.截取掉base64开头的data:image/png;base64,
  3. avatar_str = avatar.replace('data:image/png;base64,', '')
  4. # 2.base64转换为bytes类型
  5. avatar_bytes = base64.b64decode(avatar_str)
  6. # 3.创建一张图片,将bytes类型的数据写入图片中
  7. with open('./1.jpg', 'wb+') as fp:
  8. fp.write(avatar_bytes)

图片的名字看自己需求取,后缀记得是png或jpg这样类似的图片格式,不能是txt这些。

方法二:

若前端使用img标签src来接收图片地址,那我们也可将base64字符串直接传给前端就行,src是可以接收base64字符串显示图片的。

但是base64字符串还是太长了,存储在数据库中太占资源,我们可以把它上传到图片存储服务器如fastfds,返回文件索引给我们,这样存储这个索引在我们的数据库,就能减少占用的磁盘空间了。前端需要调用,就将服务器ip地址+端口+文件索引发送给前端,就能显示图片了。

实现代码如下:

  1. # 获取前端传来的base64字符串--》avatar
  2. # 去掉头部的'data:image/png;base64,'
  3. avatar_str = avatar.replace('data:image/png;base64,', '')
  4. # 将base64字符串转换为bytes
  5. avatar_bytes = base64.b64decode(avatar_str)
  6. # 创建fdfs实例
  7. client = Fdfs_client(fdfs的client.conf所在路径)
  8. # 上传图片至fdfs
  9. ret = client.upload_by_buffer(avatar_bytes)
  10. # 判断上传是否成功,是则保存图片地址到数据库
  11. if ret['Status'] == 'Upload successed.':
  12. user.user_pic = ret['Remote file_id']
  13. user.save()

 此时数据库存储的是文件索引,我们要多加一步,将完整的路径拼接了再传给前端,这样img的src接收到这个路径,就能正常显示图片。这个方法比方法一少了一步创建图片文件,能减少在自己本机的磁盘资源被占用。

注意:

1.为何要去掉base64开头的'data:image/png;base64,'呢?

因为符合base64的字符有字母、数字、+、/、=这5种,'data:image/png;base64,'这一串的冒号,分号,逗号都不符合要求,所以得去掉。

原文链接:https://blog.csdn.net/ruanxuan/article/details/124620937

标签:java,image,base64,avatar,字符串,png,图片
From: https://www.cnblogs.com/sunny3158/p/17814252.html

相关文章

  • java基础学习:关键字,标识符
    关键字:属于java语言自己的内容。java已经用了的词:public,static等等标识符: 标识符建议规范驼峰模式,例如:intstudyNumber=4;  开头单词小写,后面的单词首字母大写......
  • 2023_11_06_Java_EE_DAY_01_笔记
    2023_11_06_Java_EE_DAY_01_笔记知识点回顾:JavaseMysqlHtml+css+javascriptVue扩展:ElementPlus作业讲解与分析:知识点讲解:1. 主要核心内容(服务器端开发)a) Javaee/Spring+springMVC+MyBatis/MyBatisPlus/SpringBoot等b) 全栈工程师2. 工具:a) Idea+Mavenb) 等3. ......
  • 每天5道Java面试题(第四天)
    1. Integer和int的区别?1、Integer是int的包装类,int则是java的一种基本数据类型 2、Integer变量必须实例化后才能使用,而int变量不需要 3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值。4、Integer的默认值是null,int的默认......
  • Java:SpringBoot实现JDK动态代理和CGLIB动态代理
    (目录)需要代理的对象//接口publicinterfacePayService{voidpay();}//实现publicclassAliPayServiceimplementsPayService{@Overridepublicvoidpay(){System.out.println("AliPayService");}}1.JDK动态代理在JDK动态代......
  • JAVA多线程并发查询百万数据的内存占用问题?
    在Java中使用多线程并发查询百万数据时,内存占用是一个需要考虑的重要问题。以下是一些解决该问题的方案:分批查询:将数据分成较小的批次进行查询,而不是一次性加载全部数据。这样可以减少每个线程需要处理的数据量,降低内存占用。可以将查询结果分组或按需加载,以保持内存占用的合理范......
  • java中 Calendar日历方法使用
    java中Calendar日历方法使用Calendar类抽象类Calendar提供了一组方法,允许把以毫秒为单位的时间转换成一些有用的时间组成部分。Calendar不能直接创建对象,但可以使用静态方法getInstance()获得代表当前日期的日历对象,如:Calendarcal=Calendar.getInstance(); Calen......
  • 6字符串变量
    字符串变量三种格式单引号双引号(推荐使用)不用引号var1='abc'#原样输出,在拼接字符串中使用无效,不能解析变量var2="abc"#可以解析得到值而不是原样输出,还可以解析子双引号;Var3=abc#不能包含空格获取字符串的长度语法${#变量名}shell字符串拼接无符号......
  • javaweb-- Mybatis参数传递
     Mybatis提供了ParamNameResolver类进行封装 传入多个参数时,mybatis会将参数封装成Map集合map.put("arg0",参数值1)map.put("param1",参数值1)map.put("arg1",参数值2)map.put("param2",参数值2) ......
  • java怎么去入门,用java怎么开发一个简单的安卓程序?
    Java是一种广泛使用的编程语言,特别适合于安卓应用开发。如果你想入门Java并使用它来开发安卓应用,你可以遵循以下步骤:入门Java学习Java的基础知识:数据类型、变量、运算符控制流(if/else语句、switch语句、循环)方法(函数)面向对象编程(类、对象、继承、多态性)异常处理集合框......
  • 将整数转换为字符串的方法是什么?
    内容来自DOChttps://q.houxu6.top/?s=将整数转换为字符串的方法是什么?我正在一个项目中处理所有的从int到String的转换,都是像这样完成的:inti=5;StringstrI=""+i;我对Java不太熟悉。这是一种常见的做法吗?还是有什么错误呢?通常的做法是使用Integer.toStri......