base64图片显示问题
本文共 3,726 字,预计阅读时间 12 分钟
1.问题描述
小程序项目需要后端接口提供base64流的图片,对于H5的语法,前面拼接后面的代码即可: data:image/png;base64,
先看后台代码:
@RestController @RequestMapping("/file") public class FileController { /** * 图片转为base64流 */ @GetMapping("/imgToBase64") public JSONObject imgToBase64() { JSONObject jsonObject = new JSONObject(); try { //读取文件 InputStream in = new BufferedInputStream(new FileInputStream("C:\\Users\\zhongyushi\\Downloads\\3.jpg")); byte[] srcBytes = new byte[in.available()]; in.read(srcBytes); //把字节流转为base64字符流 String encode = new BASE64Encoder().encode(srcBytes); jsonObject.put("data", encode); } catch (Exception e) { e.printStackTrace(); } return jsonObject; } /** * 图片转为字节流 */ @GetMapping("/imgToByte") public JSONObject imgToByte() { JSONObject jsonObject = new JSONObject(); try { //读取文件 InputStream in = new BufferedInputStream(new FileInputStream("C:\\Users\\zhongyushi\\Downloads\\3.jpg")); byte[] srcBytes = new byte[in.available()]; in.read(srcBytes); jsonObject.put("data", srcBytes); } catch (Exception e) { e.printStackTrace(); } return jsonObject; } }
以vue的代码为例说明:
<template> <img :src="imageUrl"> </template> <script> export default { name: '', created() { this.getImage() }, data() { return { imageUrl: '' } }, methods: { getImage() { axios.get('http://localhost:8081/file/imgToBase64').then(res => { this.imageUrl = 'data:image/png;base64,' + res.data.data }, err => { console.log(err) }) } }, } </script> <style scoped> </style>
但对于微信小程序却不行,原因是在返回的字符串中,包含了换行符‘\n’,H5可以自动解析并去除,微信小程序却没有这么智能。
2.解决方案
在微信小程序中需要在获取到数据后把换行符替换。
WXML代码:
<view> <image src="{{imgUrl}}" style="width:100px;height:44px;"></image> </view>
JAVASCRIPT代码:
Page({ data: { imgUrl: '' }, onLoad() { this.getImg() }, getImg() { let that = this wx.request({ method: 'GET', url: 'http://localhost:8081/file/imgToBase64', success(res) { let data = res.data.data data = data.replace(/[\r\n]/g, "") that.setData({ imgUrl: 'data:image/png;base64,' +data }) } }) } })
3.扩展说明
仔细观察会发现,我是后台代码有两种方法,另外一种是直接返回字节流而不是base64流,那么这种方式就不会存在上述的问题,我以另一种组件说明。
JSON代码:
{ "usingComponents": { "mp-uploader": "weui-miniprogram/uploader/uploader" } }
WXML代码:
<view> <mp-uploader files="{{files}}" max-count="5" title="图片上传" tips="图片上传提示"></mp-uploader> </view>
JAVASCRIPT代码:
Page({ data: { files: [], }, onLoad() { this.getImg() }, getImg() { let that = this wx.request({ method: 'GET', url: 'http://localhost:8081/file/imgToBase64', success(res) { let arr = [] arr.push({ url: 'data:image/png;base64,' + res.data.data }) that.setData({ files: arr }) } }) } })
上述使用的是weui的扩展组件:图片上传的组件,使用的是字节流的方式获取图片并显示。
就是这么简单,你学废了吗?感觉有用的话,给笔者点个赞吧 !
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!