uniapp 小程序获取后端的二进制 保存到手机相册

uniapp 小程序获取后端的二进制流显示图片

以下代码演示了如何使用 `uni.request` 发起 GET 请求,并处理返回的文件流数据。

复制代码
uni.request({
      url: "https://xxx.xxx.cn/bank/file/xxx/aeb9beb4fb2444ff80d47ed11c18b991.jpg",
      method: 'GET',
      responseType: 'arraybuffer',
      header:{
        Authorization:"Bearer e2589fc8-8748-481b-8ec4-c63df33e4371"
      },
      success: res => {
        let datas = res.data;
        this.codeUrl =  'data:image/png;base64,'+uni.arrayBufferToBase64(datas);
      },
    });

主要就是将响响应的数据类型修改成 arraybuffer

最后使用uni.arrayBufferToBase64()方法将 ArrayBuffer 对象转成 Base64 字符串

小程序将base64图片字符串保存到手机相册

  1. 去除 Base64 头部信息
    提取纯数据部分,确保正确解码。
  2. 转换为 ArrayBuffer
    使用 UniApp 提供的 base64ToArrayBuffer 方法转换数据。
  3. 写入临时文件
    将数据写入小程序的临时目录,生成临时文件路径。
  4. 保存到相册
    调用 uni.saveImageToPhotosAlbum 并处理权限和结果。

testSaveBase64ToPhotoAlbum.vue代码

复制代码
<template>
    <view>
        <button class="btn" @click="handleSaveImage()">保存到相册</button>
    </view>
</template>
<script>
export default {
    data(){
        return {
            base64Img:""

        }
    },

    onLoad(options){
        // this.base64Img = this.getBase64Image();
    },

    methods: {
        saveBase64ToPhotoAlbum(base64Data) {
			// 1. 去除Base64头部信息(如:"data:image/png;base64,")
			const base64 = base64Data.replace(/^data:image\/\w+;base64,/, '');
			
			// 2. 转换为ArrayBuffer
			const arrayBuffer = uni.base64ToArrayBuffer(base64);
			
			// 3. 生成临时文件路径
			const filePath = `${wx.env.USER_DATA_PATH}/temp_${Date.now()}.png`;
			
			// 4. 写入文件
			const fs = uni.getFileSystemManager();
			return new Promise((resolve, reject) => {
				fs.writeFile({
				filePath,
				data: arrayBuffer,
				encoding: 'binary',
				success: () => {
					// 5. 保存到相册
					uni.saveImageToPhotosAlbum({
					filePath,
					success: () => resolve('保存成功'),
					fail: (err) => reject('保存失败,请检查权限:' + err.errMsg),
					});
				},
				fail: (err) => reject('文件写入失败:' + err.errMsg),
				});
			});
		},

		// 调用示例
		async handleSaveImage() {
			try {
				// 示例Base64数据,实际替换为你的数据
				const base64 = this.getBase64Image();
				await this.saveBase64ToPhotoAlbum(base64);
				uni.showToast({ title: '保存成功', icon: 'success' });
				console.error("保存图片成功");
			} catch (error) {
				console.error("保存图片失败 error:", error);
				uni.showToast({ title: error, icon: 'none' });
				// 处理权限被拒绝的情况
				if (error.includes('authorize')) {
				uni.openSetting({}); // 引导用户打开权限设置
				}
			}
		},

		getBase64Image(){
			return "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoK";// 替换完整的Base64图片字符串
		}
    }
}
</script>

<style scoped>
    .btn {
        width: 100px;
        background-color: blue;
        border-radius: 16px;
		color: white;
        font-size: medium;
        font-weight: bold;
        text-align: center;
		padding: 0 0 0 0;
        margin: 26px;
    }
</style>
  1. 用户触发
    保存操作必须由用户主动触发(如点击按钮),否则 iOS 可能拦截。
  2. 权限处理
    首次调用会弹窗请求权限。
    若用户拒绝,捕获错误并引导前往设置开启:
    uni.openSetting({});
  3. 文件格式
    根据 Base64 的 MIME 类型(如 image/png)动态设置文件后缀,确保系统正确识别。
  4. 临时路径
    使用 wx.env.USER_DATA_PATH 获取小程序文件系统根目录,避免路径问题。
  5. 性能优化
    大图片转换可能耗时,建议添加加载提示:
相关推荐
代码丰2 小时前
简历保险箱:一款本地存储、快捷填表的 Chrome 简历助手
前端·chrome
SuperEugene2 小时前
Promise 从入门到实战:同步异步、回调地狱、then/catch/finally 全解
前端·javascript·面试
希望永不加班2 小时前
Spring Boot 统一异常处理:从混乱到优雅的实用方案
java·spring boot·后端·spring·状态模式
qq_437100662 小时前
echarts图表相关 电量进度图
前端·flask·echarts
智能工业品检测-奇妙智能2 小时前
快速直播:Node.js + FFmpeg + flv.js 全栈实战
javascript·ffmpeg·node.js
学习要积极2 小时前
Spring 组件工具类-FFmpegUtils
java·后端·spring
洋不写bug2 小时前
操作系统管理:进程解析
java
liurunlin8882 小时前
Tomcat 都有哪些核心组件
java·tomcat·firefox
滴滴答滴答答2 小时前
机考刷题之 13 LeetCode 1004 最大连续1的个数 III
java·算法·leetcode