uni-app 将 base64 图片编码转为 Blob 本地文件路径

1. uni-app 将 base64 图片编码转为 Blob 本地文件路径

uni-app 将 base64 图片编码转为 Blob 本地文件路径(把base64类型的图片,转换成blob二进制文件流)适用于 uni-app / vue.js / JavaScript。

1.1. 实现方式

base64转图片格式(js)

您可以使用 JavaScript 中的 atob() 和 btoa() 函数来实现 Base64 转图片的操作。

首先,使用 atob() 函数将 Base64 编码的字符串转换为二进制数据。然后,将二进制数据转换为 Blob 对象,并创建一个 URL 对象。最后,将 URL 对象分配给图像的 src 属性即可显示图片。

javascript 复制代码
// 假设您已经有一个 Base64 编码的字符串
const base64String = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA..."

// 将 Base64 编码的字符串转换为二进制数据
const binaryString = atob(base64String.split(',')[1])

// 将二进制数据转换为 Blob 对象
const blob = new Blob([binaryString], { type: 'image/png' })

// 创建 URL 对象并将其分配给图像的 src 属性
const image = new Image()
image.src = URL.createObjectURL(blob)

// 将图像添加到文档中
document.body.appendChild(image)

请注意,您需要将 base64String 中的 data:image/png;base64, 删除,以便 atob() 函数正确解码该字符串。

如果您需要将 Base64 编码的字符串转换为文件并将其保存在本地文件系统中,请使用文件系统 API,如 FileWriter 或 FileSystem API。

1.2. base64转图片格式(uniapp)

在Uniapp中,可以使用uni.base64ToArrayBuffer() API将base64字符串转换为ArrayBuffer格式,然后将其转换为Blob对象。接着可以使用URL.createObjectURL()方法创建Blob URL,最终将其显示在页面上。

javascript 复制代码
// 将base64字符串转换为ArrayBuffer格式
const arrayBuffer = uni.base64ToArrayBuffer(base64Str);

// 将ArrayBuffer转换为Blob对象
const blob = new Blob([arrayBuffer], { type: 'image/png' });

// 创建Blob URL
const imgUrl = URL.createObjectURL(blob);

// 在页面上显示图片
this.imgUrl = imgUrl;

这里的base64Str是你要转换的base64字符串,type可以根据实际情况进行修改。最终的imgUrl就是生成的Blob URL,可以将其绑定到img标签的src属性上显示图片。

1.3. base64转图片格式(微信自带方法)

javascript 复制代码
//把base64转换成图片
getBase64ImageUrl(base64Url) {
	/// 获取到base64Data
	var base64Data = base64Url;
	/// 通过微信小程序自带方法将base64转为二进制去除特殊符号,再转回base64
	base64Data = wx.arrayBufferToBase64(wx.base64ToArrayBuffer(base64Data));
	/// 拼接请求头,data格式可以为image/png或者image/jpeg等,看需求
	const base64ImgUrl = "data:image/png;base64," + base64Data;
	/// 得到的base64ImgUrl直接给图片:src使用即可
	return base64ImgUrl;
},

1.4. 示例

javascript 复制代码
 //文件上传修改=2=
    async handleFileUri(fileByte, fileName) {
      let that = this;
      console.log("上传文件返回fileName:", fileName)
      console.log("上传文件返回fileByte:", fileByte)
      let str = "data:" + that.getFileType(fileName) + ";base64," + fileByte
      console.log("上传文件返回=str=" + str);
      let blob = that.parseBlob(str)
      const result = await uploadFile(blob);
      that.form.videoList.push(result.data);
      that.videoList.push({
        attachId: result.data.attachId,
        domain: result.data.domain,
        link: result.data.link,
        name: result.data.originalName,
        originalName: result.data.originalName,
      });
    },
    getFileType(fileName) {
      let name = ''
      switch (fileName) {
        case  ".txt":
          name = 'text/plain'
          break
        case ".cpp":
          name = 'text/x-c++src'
          break
        case ".c":
          name = 'text/x-csrc'
          break
        case ".h" :
          name = 'text/x-chdr'
          break
        case ".java":
          name = 'text/x-java'
          break
        case ".xhtml":
          name = 'application/xhtml+xml'
          break
        case ".xml":
          name = 'text/xml'
          break
        case ".html":
          name = 'text/html'
          break
        case ".jpg":
          name = 'image/jpeg'
          break
        case ".png":
          name = 'image/png'
          break
        case ".gif":
          name = 'image/gif'
          break
        case ".webp":
          name = 'image/webp'
          break
        case ".bmp":
          name = 'image/bmp'
          break
        case ".svg":
          name = 'image/svg+xml'
          break
        case  ".m4a":
          name = 'audio/mp4a-latm'
          break
        case ".aac":
          name = 'audio/aac'
          break
        case ".mp3":
          name = 'audio/mpeg'
          break
        case ".ogg":
          name = 'audio/ogg'
          break
        case ".wav":
          name = 'audio/x-wav'
          break
        case ".mp4":
          name = 'video/mp4'
          break
        case ".mkv":
          name = 'video/x-matroska'
          break
        case ".ts":
          name = 'video/mp2ts'
          break
        case ".pdf":
          name = 'application/pdf'
          break
        case ".doc":
          name = 'application/msword'
          break
        case ".docx":
          name = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
          break
        case ".xls":
          name = 'application/vnd.ms-excel'
          break
        case ".xlsx":
          name = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
          break
        case ".ppt":
          name = 'application/vnd.ms-powerpoint'
          break
        case ".pptx":
          name = 'application/vnd.openxmlformats-officedocument.presentationml.presentation'
          break
        case  ".csv":
          name = 'text/comma-separated-values'
          break
      }
      return name
    },
    /**
     * base64 → blob
     * @description 传入即可,返回blob本地文件路径
     * @param {String} base64 - base64图片编码
     * @return String
     */
    parseBlob(base64) {
      var arr = base64.split(',');
      var mime = arr[0].match(/:(.*?);/)[1];
      var bstr = atob(arr[1]);
      var n = bstr.length;
      var u8arr = new Uint8Array(n);
      for (var i = 0; i < n; i++) {
        u8arr[i] = bstr.charCodeAt(i);
      }
      var url = URL || webkitURL;
      return url.createObjectURL(new Blob([u8arr], {type: mime}));
    },
相关推荐
while(1){yan}2 小时前
网络协议TCP
java·网络·网络协议·tcp/ip·青少年编程·电脑常识
yBmZlQzJ2 小时前
财运到内网穿透-群晖NAS安装(docker版本)
运维·经验分享·网络协议·docker·容器
tiantianuser2 小时前
RDMA设计15:连接管理模块设计2
网络协议·fpga开发·rdma·高速传输·cmac
阿里云云原生3 小时前
LoongSuite:解决 WebSocket 全链路可观测性难题,赋能 AI 应用的实时链路追踪
人工智能·websocket·网络协议·阿里云·云原生·可观测
logic_53 小时前
DHCP+DNS
网络安全·udp·信号处理
游戏开发爱好者83 小时前
H5 混合应用加密 Web 资源暴露到 IPA 层防护的完整技术方案
android·前端·ios·小程序·uni-app·iphone·webview
李少兄4 小时前
从零开始全面掌握 HTTPS
网络协议·http·https
2501_915106324 小时前
最新版本iOS系统设备管理功能全面指南
android·macos·ios·小程序·uni-app·cocoa·iphone
福尔摩斯张4 小时前
TCP协议深度解析:从报文格式到连接管理(超详细)
linux·c语言·网络·c++·笔记·网络协议·tcp/ip
游戏开发爱好者84 小时前
HTTPS DDoS 排查 异常流量到抓包分析
网络协议·ios·小程序·https·uni-app·iphone·ddos